引用百度百科:
思想:
简单的说(按从小到大排序示例),就是先找一个基准值(一般是第一个数),设置两个“指针” i 和 j 。j 从数组的最后一位开始往前遍历,当“指针”所指的数小于基准值时,j 不再移动; i 开始从前往后遍历,当 i 所指向的值大于基准值时,交换 i,j 指针所指值,然后再次重复此过程。直到 i == j 的时候,退出循环。此时将基准值与 i,j (i == j)的位置互换,这个位置就是基准值在排序后的最终位置。(因为基准值前面的数都不大于它,后面的值都不小于它)
最后拆分数组,将基准值前面的数组和后面的数组再次按上述处理。
快速排序是不稳定的排序方法
最优时间复杂度是 O(nlogn)
最差时间复杂度是 O(n2)
期望时间复杂度是 O(nlogn)
public class Quicksort {
public static void main(String[] args) {
int[] arr = {4,1,5,2,2,7,5,6,0,9};
int len = arr.length;
//从小到大快速排序
quickSort(arr, 0, len-1);
for(int i=0; i<len; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
private static void quickSort(int[] arr, int l, int r) {
if(l >= r) return ; //只有一个元素或不合法时返回
int i = l;
int j = r;
int key = arr[l]; //基准值
while(i < j) {
while(i < j && arr[j] >= key) //从后开始往回找
j --;
while(i < j && arr[i] <= key)
i ++;
if(i < j)
swap(arr, i, j);
}
swap(arr, i, l); //基位确定最后的位置(i == j),之后基准位不再参与排序
quickSort(arr, l, i-1);
quickSort(arr, i+1, r);
}
private static void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
如有错误或不合理的地方,敬请指正!
加油!!