快速排序实现(快排)

Posted go-ahead-wsg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序实现(快排)相关的知识,希望对你有一定的参考价值。

/*
先来看下快排
9.9 快速排序
事实上,不论是C++ STL、java SDK或者.NETFrameWork SDK等开发工具包中的源代码中都能找到它的某种实现版本。
快速排序算法是由图灵奖获得者TonyHoare设计出来的,他在形式化方法理论以及AL-GOL60编程语言的发明中都有卓越贡献,
是上世纪最伟大的计算机科学家之一,我们现在学习的这个快速排序算法,被列为20世纪十大算法之一。快去看下它到底有多牛吧。

希尔排序相当于直接插入排序的升级,他们同属于插入排序类
堆排序相当于简单选择排序的升级,他们同属于选择排序类
而快速排序其实就是我们前面认为最慢的冒泡排序的升级,他们都属于交换排序类,即他也是通过不断比较和移动交换来实现排序的,
只不过它的实现,增大了记录的比较和移动距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,
从而减少了总的比较次数和移动交换次数。

快排思想:
    通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,
已到达整个序列有序的目的。
    从字面上感觉不出它的好处来。假设现在要对数组{50,10,90,30,70,40,80,60,20}进行排序。我们通过代码的讲解来学习快速排序的精妙。
*/

//对顺序表L作快速排序
void QuickSort(SqList *L)
{
    QSort(L, 1, L->length);
}

/*
---------寻找枢轴记录,并在寻找的过程中swap交换排序-------是算法的重点
交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置
此时在它之前(后)的记录均不大(小)于它
*/
int Partition(SqList *L, int low, int high)
{
    int pivotkey;
    //有子表的第一个记录作枢轴记录
    pivotkey = L->r[low];
    //从表的两端交替向中间扫描
    while (low < high)
    {
        while(low < high && L->r[high] >= pivotkey)
            high--;
        //将比枢轴记录小的记录交换到低端
        swap(L, low, high);
        while(low < high && L->r[low] <= pivotkey)
            low++;
        //将比枢轴记录大的记录交换到高端
        swap(L, low, high);
    }
    //返回枢轴记录所在位置
    return low;
}

//对顺序表L中的子序列L->r[low..high]作快速排序
void QSort(SqList *L, int low,int high)         //这里的low和high
{
    int pivot;
    if (low < high)
    {
        //将L->[low..high]一分为二
        //算出枢轴值pivot
        pivot = Partition(L, low, high);
        //对低子表递归排序
        QSort(L, low, pivot -1);
        //对高子表递归排序
        QSort(L, pivot+1, high);
    }
}

 

以上是关于快速排序实现(快排)的主要内容,如果未能解决你的问题,请参考以下文章

快速排序Java代码简洁实现

Python 实现快排

JavaScript实现快速排序算法

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)