zoukankan      html  css  js  c++  java
  • 读书日记-快速排序算法

    性能

      快速排序的最坏时间为O(n2),平均时间复杂度为O(nlgn)。

    算法导论对快速排序的描述是:

      分解:数组A[p..r] 被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..p-1]的每个元素小于等于A[q],而A[q]也小于等于[q+q..r]中的每个元素。

      解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。

      合并:因为子数组都是原址排序,所以不需要合并操作:数组A[p..r]已经有序。

    即,利用分治思想对数组A[p..r]进行划分成子数组A[p..q-1]和A[q+1..r],

      且通过与基数比较使得A[p..q-1]小于基数,A[q+1 ..r] 大于基数,

      直至子数组中元素个数为1,则完成快速排序。

    简单例子,对下列数组进行快速排序:

    96 20 60 33 72 2 42 57 22 50

    以最后一个元素为基数则排序如下,    表示q指示的位置,      表示当前比较到的位置,     表示与q交换后的位置 

      ->   96 20 60 33 72 02 42 57  22 50    从 第一个元素开始比较,  96大于50  此时没有移动    q = 0   ->   20 96 60 33 72 02 42 57  22 50    从 第一个元素开始比较,20小于50往前移。 20与q上的数字90交换,交换后q=1
      ->   20 96 60 33 72 02 42 57  22 50
      ->   20 33 60 96 72 02 42 57  22 50
      ->   20 33 60 96 72 02 42 57  22 50
      ->   20 33 02 96 72 60 42 57  22 50
      ->   20 33 02 42 72 60 96 57  22 50
      ->   20 33 02 42 72 60 96 57  22 50
      ->   20 33 02 42 22 60 96 57  72 50
      ->   20 33 02 42 22 50 96 57  72 60


    这样 0-5 小于50 ,6-9大于50。

    分成如下2个数组

    A[p .. q-1] 数组如下

    20 33 02 42 22 50

    A[q+1 .. r] 数组如下

    92 56 72 60

    分别对2个数组继续分解划分即可完成排序

    代码如下:

    int Partition(int* A,int p,int r)
    {
         int x = A[r];   // 基数
         int  q =p;
         for(int j=p;j<r;++j)
         {
               if(A[j] <=x)
               {
                    int temp = A[q];
                    A[q]  = A[j];
                    A[j]    =temp;
                     ++q;
                 }
            }
            q=(q-1<p)?p:q-1;
           return q;
    }
        
    
    //  快速排序
    void Quicksort(int* A,int p,int r)
    {
       if(p<r)
        {  
             int  q = Partition(A,p,r);
             Quicksort(A,p,q-1);
             Quicksort(A,p+1,r);
         }
    }

     

  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/stratrail/p/5027899.html
Copyright © 2011-2022 走看看