vlambda博客
学习文章列表

数据结构:排序(2)|| 快速排序

气泡排序

特性:反复交换相邻序列值,从而达到排序目的

时间复杂度:O(n^2)

气泡排序应该十分熟悉了,这里就略过了。


快速排序

快速排序简称快排,是对气泡排序的一种改进,是一种递归算法,通过一趟排序将待排记录分为独立两部分,在某一枢轴量左侧,均是小于它的值,在其右侧,均是大于它的值,对序列不断分割,最后会形成有序序列。

void QSort(Sqlist &L,int low,int high){ int pivotloc; if(low<high) { pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,privotloc+1,high); }}

Partition函数的作用是,对low,high区间进行快排,返回枢轴位置

快速排序图解

Partition函数在使用过程中有“反复横跳”的感觉。

当low方向发现一个不合法数据,立刻跳转至high,将high覆盖,注意,由于枢轴被暂存,在数据中是有一个空格存在的,最后枢轴放进去,空格填补排序结束,返回枢轴位置。

int Partition(Sqlist &L, int low, int high){ L[0] = L[low]; //暂存 int pivotkey = L[low]; //令low处值为枢轴 //反复横跳式判断 while (low < high) { while (low < high && L[high] >= pivotkey) --high; //该循环将high移动到了第一个不合法的位置 L[low] = L[high]; //low用high覆盖,第一个low已经保存了所以不用担心low while (low < high && L[low] <= pivotkey) ++low; //移动low到第一个不合法位置 L[high] = L[low]; } //出口一定是low=high L[low] = L[0]; return low; //返回枢轴位置便于下次调用}

时间复杂度分析

快速排序的时间复杂度:k*n*ln(n)

通常快速排序被认为是这一类较先进的排序方法中平均性能最好的,所以它叫做快速排序。但是如果对基本有序或已经有序的序列排序时,它会退化为气泡排序。详细分析过程见书。