快速排序
快速排序是通过不断比较关键码、交换记录,最终以某个记录为界(该记录称为支点),将待排序序列分成两部分。其中,一部分所有记录的关键码大于等于支点的关键码,另一部分所有记录的关键码小于支点的关键码。我们将待排序序列按关键码以支点分成两部分的过程,称为一次划分。对各部分不断划分,直到整个序列按关键码有序
public int Partition(int low,int high) /*一趟快排序*/ { /*交换顺序表tbl中子表tbl->[low…high]的记录,使支点记录到位,并反回其所在位置*/ /*此时,在它之前(后)的记录均不大(小)于它*/ r[0]=r[low]; /*以子表的第一个记录作为支点记录*/ while(low<high) /*从表的两端交替地向中间扫描,以寻找支点位置*/ { while(low<high&&r[high]>= r[0]) high --; r[low]=r[high]; /*将比支点记录小的交换到低端*/ while(low<high&&r[low] <= r[0]) low++; r[high]=r[low]; /*将比支点记录大的交换到高端*/ } r[low]=r[0]; /*支点记录到位*/ return low; /*反回支点记录所在位置*/ }
public void QSort(int low,int high) /*递归形式的快排序*/ { /*对顺序表tbl中的子序列tbl->[low…high]作快排序*/ if(low<high) { int pivotLocation=Partition(low,high); /*将表一分为二*/ QSort(low, pivotLocation-1); /*对低子表递归排序*/ QSort(pivotLocation+1,high); /*对高子表递归排序*/ } }
快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取支点记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。