目录
思路
从数列中选择一个元素作为基准,将大于基准的元素放在基准右边,小于基准的元素放在基准左边,在对左右两边的数列进行相同的操作。
代码
private static void qucikSort(int[] arr, int l, int r) {
if (l >= r){
return;
}
int x = arr[l];
int right = r;
int left = l;
while (l<r){
//若选择l作为基准,则先移动r
while (l<r && arr[r]>=x){//等号不能去除,否则会死循环
r--;
}
if (l<r){
arr[l] = arr[r];
}
while (l<r && arr[l]<=x){
l++;
}
if (l<r){
arr[r] = arr[l];
}
if (l==r){
arr[l] = x;
}
}
qucikSort(arr,left,l-1);
qucikSort(arr,l+1,right);
}
时间复杂度O(NlogN);
额外空间复杂度O(logN);
不具有稳定性;
总结
时间复杂度O(NlogN)的排序与O(N2)的排序相比都有一个特点,每一次排序动作之后会有信息传递到下一次排序,使后续的排序减少无用的动作。
快速排序在排序算法中有非常重要的意义,在需要使用排序的场景中,一般首先考虑快速排序,虽然快速排序与归并排序的时间复杂度一致,但在大量的实践中发现快速排序的时间复杂度常数项会明显低于归并排序以及其它O(NlogN)的排序。