简介
这是个人对于快速排序算法的理解,如有错误感谢指出.
基本概念:参考链接
基础理论:通过将每个数在数组中相对位置确定,即当左侧没有比当前数大,右侧没有比当前数小的值时,当前位置在数组中相对稳定(存在相同值情况,当存在相同值时,位置就处于一个区间内了),通过逐个确定每个数的位置,就可以将数组中的所有值确定相应的顺序.
解析
图解:
根据上图,通过交换和遍历判断大小,可以确定俩测的数值是否大于或小于当前值,通过逐步缩小未确定的值,并最终将未确定的值为0,到达确定数的位置处于稳定位置.
通过递归,代入当前值的左侧未排序区间进行排序,当区间逐渐缩小到,当前确定当前值左侧只存在一个或没有值,右侧存在一个或没有值时,则此时的当前值位置确定,再通过逐个遍历即可确定顺序.
代码:
private static void awap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
private static void quickSort(int[] arr, int startIndex, int endIndex) {
if (arr != null && arr.length > 0) {
int start = startIndex;
int end = endIndex;
//target是本次循环要排序的元素,每次循环都是确定一个元素的排序位置,这个元素都是开始下标对应的元素
int target = arr[startIndex];
//开始循环,从两头往中间循环,相遇后循环结束
while (start < end) {
//从右向左循环比较,如果比target小,就和target交换位置,让所有比target小的元素到target的左边去
while (start < end) {
if (arr[end] < target) {
awap(arr, start, end);
break;
} else {
end--;
}
}
//从左向右循环比较,如果比target大,就和target交换位置,让所有比target大的元素到target的右边去
while (start < end) {
if (arr[start] > target) {
awap(arr, start, end);
break;
} else {
start++;
}
}
}
//确定target的排序后,如果target左边还有元素,继续递归排序+
if ((start - 1) > startIndex) {
quickSort(arr, startIndex, start - 1);
}
//确定target的排序后,如果target右边还有元素,继续递归排序
if ((end + 1) < endIndex) {
quickSort(arr, end + 1, endIndex);
}
}
}
@Test
public void test() {
int[] arr = new int[]{4, 1, 8, 5, 3, 2, 9, 10, 6, 7};
quickSort(arr, 0, 9);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + ",");
}
}