欢迎来到沾花把玖的C++算法课堂!
数据排序——快速排序
1.基本思想:
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排记录分割成独立的两个部分,其中一个部分记录的关键字均比另一部分记录的关键字小,则可分别对这两个部分记录继续排序,以达到整个序列有序。
假设待排序的序列为{a[l],a[l+1],a[l+2],...,a[r]},首先任意选取一个记录(通常可以选择中间一个记作为支点或枢轴),然后重新排序其余记录,将所有关键字小于它的记录都放在左子序列中,所有关键字大于它的记录都放在右子序列中。由此可以将该支点记录所在的位置mid作为分界线,将序列分割成两个子序列和。这个过程称作一趟快速排序(或一次划分)。
一趟快速排序的具体做法是:附设两个指针i和j,它们的初始值分别为l和r,设支点记录取mid,则首先从j所指向的位置起向前搜索找到第一个关键字小于mid的记录,然后从i所指向的位置起向前搜索找到第一个关键字大于mid的记录,将它们相互交换,重复这两步,直至i>j为止。
2.动图演示:
3.代码:
void qsort(int l,int r){
int i,j,mid;
i=l;j=r;
mid=a[(l+r)/2]; //将当前序列在中间位置的数定义为分隔数
do{
while(a[i]<mid)i++; //在左半部分寻找比mid大的数
while(a[j]>mid)j--; //在右半部分寻找比mid小的数
if(i<=j){ //若找到一组与排序目标不一致的数对,则交换它们
swap(a[i],a[j]);
i++;j--; //继续找
}
}while(i<=j);
if(l<j)qsort(l,j); //若未到两个数的边界,则递归搜索左右区间
if(i<r)qsort(i,r);
}
4.说明:
快速排序的时间复杂度为O(NlogN),速度快,但不稳定。就平均时间而言,快速排序是目前被认为最好的一种内部排序方法。
从时间上看,快速排序的平均性能优于其他排序方法,但快速排序需要一个栈空间来实现递归。若每一趟排序都将记录序列均匀地分割成长度相接近的两个子序列,则栈的最大深度为log(n+1)。
本文内容为小编自己汇总,内容可能会有错误或疏漏,感谢大家的提议!
记得点赞和关注哦~