快速排序
Quick sort 是对冒泡排序的一种改进,时非常重要且应用广泛的一种高效率排序算法
基本思路
快速排序时通过多次比较和交换实现的排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分镜像排序使得其中一部分所有的数据都比另一部分小,然后继续递归这两部分,最终实现所有数据有序
实现步骤
- 选取一个Key作为当前的分界值,一般选取第一个 key = num[0],设置左右指针left,right指向数组的两端
- 比较 num[right] 与key的大小,一直向前直到找到小于key的值,设置num[left] = num[right] (这时候num[left]存储在key中,不会丢失)
- 交换后,left向右移动,直到找到大于key的数据,设置num[right] = num[left],覆盖之前设置给left的重复数据
- 当left与right重合后,设置为key
- 此时一轮排序结束,已经保证key左侧都小于key,右侧都大于key
- 递归完成左半部分,右半部分的排序
实现代码
public class Main {
public static int[] num = new int[]{23,35,15,20,9,5,45,56,11,2};
public static void quickSort(int left,int right){
int r = right;
int l = left;
if(right - left <= 1){
return;
}
int key = num[left];
while(left != right){
while(num[right] >= key){
if(left!=right){
right--;
}else{
break;
}
}
num[left] = num[right];
while(num[left] <= key){
if(left!=right){
left++;
}else{
break;
}
}
num[right] = num[left];
}
num[left] = key;
quickSort(l,left);
quickSort(left+1,r);
}
public static void main(String[] args) {
quickSort(0,num.length-1);
for(int n : num){
System.out.print(n + "\t");
}
}
}
效率分析
平均时间复杂度是 O(nlogn),其中 n 是数组的大小。
分支每次都取一半复杂度logN,一次排序复杂度n 综合复杂度O(nlogn)