快速排序的中心思想是将小的数放在左边,大的数放在右边,那什么算小,什么算大呢?
我们可以在数列中找到一个数来作为评判其他数的大小,大于这个数就放在这个数右边,小于这个数就放在这个数的左边,我们把这个数叫主元。
我们可以把第一个数当成主元,然后分别从数列的头和尾判断每个数的大小,如果左边的数小于主元,那我们继续往后寻找,同理,如果右边的数大于主元,我们继续往前寻找。如果发现左边的指针跟右边的指针都停止了寻找,那我们就将目前左边指针指向的数跟右边指针指向的数交换。直到左边的数都小于主元,右边的数都大于主元,此时左边的指针跟右边的指针指向的位置相同了,我们就把主元放进这个位置,那么一次大概的检索就做完了。
具体代码如下:
int Partition(int A[],int left,int right){ //left跟right的初始值为序列首尾下标
int temp = A[left]; //temp是主元
while(left<right){
while(left<right && A[right] > temp) right--;
A[left] = A[right];
while(left<right && A[left] < temp) left++;
A[left] = A[right];
}
A[left] = temp;
return left;
}
当然,这样的结果肯定还是杂乱无章的,上述操作还需要反复进行,所以我们使用递归算法,反复调用上述操作,直到最后的结果是我们想要的有序数列。
void quickSort(int A[],int left,int right){
if(left<right){
//将[left,right]按主元位置一分为二
int pos = Paetition(A,left,rig

本文详细介绍了快速排序算法的工作原理,包括如何选择主元,以及如何通过随机化和二分策略提升算法效率。在面对接近有序的序列时,随机选择主元能避免最坏情况的时间复杂度,而二分思想则能更有效地划分区间。通过这两种优化方法,可以确保快速排序在平均情况下的时间复杂度为O(nlogn)。
最低0.47元/天 解锁文章
1549





