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);
         }
    }

     

  • 相关阅读:
    【Java】组合 继承 代理
    《Thinking In Java》笔记之十三章 字符串
    常用Dos命令
    Thinking in Java异常笔记与习题
    php去重 逗号分隔的字符串
    php 连接本地数据库
    vue重载子组件
    小程序更改checked样式
    JavaScript中两个数组的拼接
    FROM_UNIXTIME()时间戳转换函数
  • 原文地址:https://www.cnblogs.com/stratrail/p/5027899.html
Copyright © 2011-2022 走看看