本文已参与「新人创作礼」活动,一起开启掘金创作之路
6、快速排序
CSDN学习网址:blog.csdn.net/qq_28584889…
快速排序是最快的排序算法,平均时间复杂度为O(nlogn),最坏时间复杂度为O(n2),快速排序是不稳定的算法。
待搞懂问题:快速排序的时间复杂度问题
快速排序是分治思想的一种体现,将大问题花费为小问题,逐一进行解决,合并起来就是大问题的解。
算法思想:每次选择第一个数为基准base,将base逐渐还原到原来的位置,什么叫原来的位置,我们这里指的是,base左边的值都小于等于base,右边的值都大于等于base,第一次将base还原到原来的位置后,将原来的数组划分为两个区间,小于等于base和大于等于base的区间,再继续进行划分
代码实现过程中容易出现的问题
1.递归函数必须有结束条件,即在start >= end的时候返回;
2.7.8行中的俩个while循环中,必须保证i < j,否则可能会一直遍历下去,产生数组越界错误;
3.第9行的判断条件必须有,否则7,8行循环结束后,若i==j了,则无需进行交换;
4.7和8行中的比较与base的值中,是否必须存在等号呢?若俩个等号都取消掉,i是必须要设置等号的,否则第一次就堵在门口了,然后接着就把base交换出去了,但是j的=号是不是必须的设置呢?我们说这里不是必须要设置的,如果设置,就会将遇到的等于base的值设置在base最终还原位置的右边,如果不设置等号,就会加入base最终还原位置的左边区间。
public static void quickSort(int[] arr,int start,int end){
if(start >= end) return;
int i = start;
int j = end;
int base = arr[start];
while(i < j){
while(i < j && arr[j] >= base) --j;
while(i < j && arr[i] <= base) ++i;
if(i < j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[start] = arr[i];
arr[i] = base;
quickSort(arr,start,i - 1);
quickSort(arr,i + 1,end);
}
\