快速排序
参考:快速排序
1、快排概述
快排的基本思想:
- 先从数列中取出一个数作为基准数;
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
快排中体现了分治思想,双指针。
快排相比其他排序方式的优势:快速排序之所以比较快,是因为相比冒泡排序,每次的交换都是跳跃式的,每次设置一个基准值,将小于基准值的都交换到左边,大于基准值的都交换到右边,这样不会像冒泡一样每次都只交换相邻的两个数,因此比较和交换的此数都变少了,速度自然更高。当然,也有可能出现最坏的情况,就是仍可能相邻的两个数进行交换,和冒泡排序一样是O(n2)。正常情况下,平均时间复杂度为O(NlogN)。
2、代码实现
挖坑填数方法总结:
1.i =low; j = high; 双指针指向首尾位置。将基准数挖出形成第一个坑s[i]。基准数用变量存储起来,此时原来基准数位置形成第一个坑。
2.j--由后向前找比它小的数,找到后挖出此数填前一个坑s[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑s[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入s[i]中。
利用分治思想,递归调用函数,所以在整个排序前,先判断low,high指针是否符合要求,提供排序效率,避免申请变量。
void quickSort(int[] s,int l,int h){
if(l<h){
int i=l,j=h;//双指针指向首尾位置
int x=s[l];//取出基准数
while(i<j){
while(i<j&&s[j]>=x){//从右往左,找比基准数小的数
j--;
}
if(i<j){
s[i++]=s[j];//将s[i]的坑填上,并且指针向后移
}
while(i<j&&s[i]<x){//从左往右,找比基准数大的数
i++;
}
if(i<j){
s[j--]=s[i];
}
}
}
s[i]=x;
quickSort(s,l,i-1);
quickSort(s,i+1,h);
}
信心最重要