美文网首页
七大排序之快速排序

七大排序之快速排序

作者: 里里角 | 来源:发表于2018-08-12 14:30 被阅读74次

<QuickSort> 不稳定排序
相比于冒泡排序,每次交换是跳跃式的,总的比较和交换次数少。
基本思路:确定一个轴点pivot(通常选取第一个元素),其左半边元素都比pivot小,右半边元素都比pivot大。
算法实现:二分式递归,将所有元素逐个转换成pivot的过程。(挖坑填数+分治法)
平均性能:T(n)=O(nlogn)

void QuickSort(int a[],int lo,int hi)
{
    if(hi-lo<2) return;
    int mi=Partition(a,lo,hi);
    QuickSort(a,lo,mi);
    QuickSort(a,mi+1,hi);
}

int Partition(int a[],int lo,int hi)
{
    Swap(a[lo],a[lo+rand()%(hi-lo)]);
    int pivot = a[lo];  //以首元素为候选轴点(挖出第一个坑),经以上交换,等效于随机选取
    //哨兵i从左往右找比pivot大的数,哨兵j从右往左找比pivot小的数
    int i=lo;
    int j=hi;
    while(i<j)
    {
        //j先出动,从右往左找比pivot小的数来填a[i]
        while(i<j && a[j]>= pivot)
            j--;
        if(i<j)
        {
            a[i]=a[j]; //找到a[i]比轴点小,将a[j]填到a[i]中,a[j]就形成了一个新的坑
            i++;
        }
        // 从左向右找大于或等于x的数来填a[j]
        while(i<j && a[i]<= pivot)
            i++;
        if(i<j)
        {
            a[j]=a[i];  //将a[i]填到a[j]中,a[i]就形成了一个新的坑
            j--;
        }
    }
//退出时,两哨兵相遇,有个空坑,将pivot填入其中
    a[i]=pivot;

    return i;
}

快速排序还有很多改进版本,如随机选择基准数(已实现),区间内数据较少时直接用别的方法排序以减小递归深度。

相关文章

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 1.2-交换排序-快速排序

    参考链接 交换排序:快速排序(Quick Sort) 白话经典算法系列之六 快速排序 快速搞定 快速排序是C.R....

  • 排序算法之插入排序和希尔排序(shell sort)

    插入排序(inserction sort)和希尔排序(shell sort) 相关文章 排序算法之快速排序

  • 2018-07-03

    排序算法之快速排序 快速排序算法由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加...

  • JS实现排序算法

    原文:常见排序算法之JavaScript实现 - 知乎 目录 冒泡排序 选择排序 插入排序 合并排序 快速排序 1...

  • 七大排序之快速排序

    不稳定排序相比于冒泡排序,每次交换是跳跃式的,总的比较和交换次数少。基本思路:确定一个轴点pivot(通常选取第一...

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

网友评论

      本文标题:七大排序之快速排序

      本文链接:https://www.haomeiwen.com/subject/qsssbftx.html