美文网首页
快排的思想

快排的思想

作者: analanxingde | 来源:发表于2018-03-31 16:41 被阅读75次

分治

快速排序基于算法中很重要的思想是 分治。

  • 分解(Divide):将原问题分为一系列子问题
  • 解决(Conquer):递归的解决子问题。如果子问题足够小,直接解决子问题
  • 合并(Combine):将子问题的结果合并为原问题的

子问题解决方法

选取一个基准元素(pivot)
比pivot小的放到pivot左边,比pivot大的放到pivot右边
对pivot左边的序列和右边的序列分别递归的执行步骤1和步骤2

伪代码:

QUICKSORT(A, p, r)
    if p < r    
        q = PARTITION(A, p, r)
        QUICKSORT(A, p, q-1)
        QUICKSORT(A, q+1, r)

//将数组分为两部分,返回临界值下标
PARTITION(A, p, r)
    x = A[r]    //以最后一个数为主元(pivot element)
    i = p-1 //小于主元子数组的下标上限
    for j = p to r-1
        if A[j] <= x
            i = i+1 //增加小于主元子数组的大小
            exchange A[i] with A[j] //将A[j]加入小于主元的子数组
    exchange A[i+1] with A[r]   //将主元从数组末尾移动至子数组之间
    return i + 1

源码

partition示例
void quickSort(vector<int> &vi, int low, int up)  
{  
    if(low < up)  
    {  
        int mid = partition(vi, low, up);  
        //Watch out! The mid position is on the place, so we don't need to consider it again.  
        //That's why below is mid-1, not mid! Otherwise it will occur overflow error!!!  
        quickSort(vi, low, mid-1);  
        quickSort(vi, mid+1, up);  
    }  
} 

int partition(vector<int> &vi, int low, int up)  
{  
    int pivot = vi[up];  
    int i = low-1;  
    for (int j = low; j < up; j++)  
    {  
        if(vi[j] <= pivot)  
        {  
            i++;  
            swap(vi[i], vi[j]);  //i+1是大于pivot的区域的第一个元素
        }  
    }  
    swap(vi[i+1], vi[up]);  
    return i+1;  
} 

应用partition

剑指offer:

  • 最小的K个数
  • 数组中出现次数超过一半的数

相关文章

  • 快排的思想

    分治 快速排序基于算法中很重要的思想是 分治。 分解(Divide):将原问题分为一系列子问题 解决(Conque...

  • 算法 -- 排序

    快排 原理 快排利用分治思想。快排的思想是这样的:如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p...

  • JS实现快速排序

    看了一篇通俗易懂的快排文章 快排,下面一步一步 实现整个过程。 快排的基本思想 上面链接的文章对快排的思路提出了一...

  • 排序(下):如何用快排思想在 ○(n) 内查找第 k 大元素

    排序(下):如何用快排思想在 ○(n) 内查找第 k 大元素 快排核心思想就是 分治 和 分区,我们可以利用分区的...

  • 数据结构:快速排序优化思路

    既然这是一篇主题思想为优化快排的文章,自然就不讨论关于快排的一些定义和基础性的问题,只说快排应该怎么优化。 快排为...

  • 快速排序

    快排的思想是递归,一次快排函数是使用的双指针。一次快排中,任选一个轴点,一次快排后,左边的元素比它小,右边的元素比...

  • 快排,递归,非递归,三向切分,去掉边界条件

    快排 快排的思想: 典型的分治,将数组分成两个子数组,并且分别对子数组排序,且子数组的排序也是分治。 快排和归并排...

  • 【手撕代码6】常考

    快排 快排思想:在数据集之中,选择一个元素作为"基准"(pivot)。所有小于"基准"的元素,都移到"基准"的左边...

  • 算法

    查找:二分查找 排序 快排基于快排思想解决的问题partition,第k大的数字 归并 几种排序算法的时间复杂度,...

  • 快排和利用快排思想查找数组第K大的数

    问题:利用快排思想查找一个数组中第K大的数。 思路:快排中递归调用一个返回第一个数字把数组分成两部分之后的一个下标...

网友评论

      本文标题:快排的思想

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