快速排序

快速排序是通过不断比较关键码、交换记录,最终以某个记录为界(该记录称为支点),将待排序序列分成两部分。其中,一部分所有记录的关键码大于等于支点的关键码,另一部分所有记录的关键码小于支点的关键码。我们将待排序序列按关键码以支点分成两部分的过程,称为一次划分。对各部分不断划分,直到整个序列按关键码有序

复制代码
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))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取支点记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。

posted @   游戏鼻祖  阅读(172)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示