package Sort;
/**
* 复杂度:最坏情况下:O(n^2),像冒泡一样,每次比较都需要替换,但这种情况并不常见。平均复杂度是 O(nlogn)
* 稳定性定义:数组arr中有若干元素,其中A元素和B元素相等。并且A元素在B元素前面,如果使用某种排序算法排序后,
* 能够保证A元素依然在B元素的前面,可以说这个该算法是稳定的。
*
* */
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[]{8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
quickSort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void quickSort(int arr[], int begin, int end) {
if (begin < end) { // 至少有两个以上的元素
int base = arr[begin]; // 设置第一个数为基准
int i = begin;
int j = end;
while (i < j) {
while (i < j && arr[j] >= base) { // 从右往左找比base小的
j--;
// 为什么每次都需要j先移动,因为当最后i和j相碰时,此时所指向的是j寻找到比基准值小的数字,然后和基准值交换能确保基准值左边的都是小于基准值的数字,
// 但是如果i先右边移动的话,最后i和j相碰时,i和j所指向的是i寻找得比基准值大的数,此时和基准值相交换,基准值左边是有一个比基准值大的数,没有达到我们需要的排序效果。
}
arr[i] = arr[j]; // 找到后,将比基准小的和左边比基准大的进行替换
while (i < j && arr[i] <= base) { // 然后从左往右找比base大的
i++;
}
arr[j] = arr[i]; // 找到后进行替换
}
arr[i] = base; // 当两个指针相等时,就是基准的位置
quickSort(arr, begin, i - 1);
quickSort(arr, i + 1, end);
} else {
return;
}
}
}