排序算法之快速排序
1、基本思想:
快速排序是对冒泡排序的一种改进。
在待排序表L[1...n]中任取一个元素pivot(通常可选第一个记录L[1]作为枢轴(或交点)),通过一趟排序,将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中所有元素小于pivot,L[k+1...n]中所有元素大于或等于pivot,则pivot放在了其最终位置L[k]上,这个过程称作一趟快速排序,而后分别递归地对两个子表重复上述过程,直至每部分只有一个元素或空为止,即所有元素放在了其最终位置上。
2、一趟快速排序的具体做法:
(1)附设两个指针low和high,他们的初值分别为low和high,设枢纽记录的关键字为pivotkey。
(2)首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换。
(3)然后从low所指位置起向后搜索,找到第一个关键字大于pivotkey的记录与枢轴记录互相交换。
(4)重复(2)、(3),直至low=high为止。
3、快速排序算法:
int Partition(SqList &L,int low,int high){
//交换顺序表L中子表L.r[low...high]的记录,使枢轴记录到位,并返回其所在位置,此时
//在它之前(后)的记录均不大(小)于它。
L.r[0]=L.r[low]; //用子表的第一个记录作枢轴记录
pivotkey=L.r[low].key; //枢轴记录关键字
while(low<high){ //从表的两端交替的像中间扫描
while(low<high && L.r[high].key>=pivotkey)
--high; //将比枢轴记录小的记录移到低端
L.r[low]=L.r[high];
while(low<high && L.r[low].key<=pivotkey)
++low; //将比枢轴记录大的记录移到高端
L.r[high]=L.r[low];
}
L.r[low] = L.r[0]; //枢轴记录到位
return low; //返回枢轴位置
}//Partition
void QuickSort(SqList &L,int low,int high){
if(low<high){ //递归跳出的条件
int pivotloc = Partition(L,low,high); //将L.r[low...high]一分为二
QuickSort(L,low,pivotloc-1); //对低子表递归排序,pivotloc是枢轴位置
QuickSort(L,pivotloc+11,high); //对高子表递归排序
}
}
4、实例:

5、 性能分析:
(1)空间效率:由于快速排序是递归的,需要借助一个递归工作栈。若每一趟排序都将记录序列均匀地分割成长度相接近的两个子序列,则栈的最大深度为,但是,若每趟排序后,枢轴位置均偏向子序列的一端,则为最坏情况,栈的最大深度为n,因而空间复杂度在最坏情况下为O(n),平均情况下为O(
)
(2)时间复杂度:快速排序的运行时间与划分是否对称有关,平均情况下,时间复杂度为O(),最坏的情况下可达到O(n²)。
(3)稳定性:快速排序是一个不稳定的排序算法。
(4)快速排序是所有内部排序算法中平均性能最优的排序算法。
6、参考文献:
[1]《数据结构(C语言版)》,严蔚敏、吴伟民编著,清华大学出版社,ISBN:978-7-302-14751-0
[2]《2019年数据结构考研复习指导》,王道论坛.组编,中国工信出版集团、电子工业出版社,ISBN:978-7-121-33708-6

浙公网安备 33010602011771号