zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序算法编辑快速排序一般指快速排序算法

    快速排序(Quicksort)是对冒泡排序的一种改进。
    快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    算法介绍编辑

    快排图快排图
    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
    一趟快速排序的算法是:
    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
    5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

    2排序演示编辑

    示例

    假设用户输入了如下数组:
    下标
    0
    1
    2
    3
    4
    5
    数据
    6
    2
    7
    3
    8
    9
    创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值)。
    我们要把所有比k小的数移动到k的左面,所以我们可以开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3,完成第一次比较:
    下标
    0
    1
    2
    3
    4
    5
    数据
    3
    2
    7
    6
    8
    9
    i=0 j=3 k=6
    接着,开始第二次比较,这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据的6做交换,数据状态变成下表:
    下标
    0
    1
    2
    3
    4
    5
    数据
    3
    2
    6
    7
    8
    9
    i=2 j=3 k=6
    称上面两次比较为一个循环。
    接着,再递减变量j,不断重复进行上面的循环比较。
    在本例中,我们进行一次循环,就发现i和j“碰头”了:他们都指向了下标2。于是,第一遍比较结束。得到结果如下,凡是k(=6)左边的数都比它小,凡是k右边的数都比它大:
    下标
    0
    1
    2
    3
    4
    5
    数据
    3
    2
    6
    7
    8
    9
    如果i和j没有碰头的话,就递加i找大的,还没有,就再递减j找小的,如此反复,不断循环。注意判断和寻找是同时进行的。
    然后,对k两边的数据,再分组分别进行上述的过程,直到不能再分组为止。
    注意:第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。
     1 using System; 
     2     using System.Collections.Generic; 
     3     using System.Linq; 
     4     using System.Text;
     5     namespace test
     6 {
     7     class QuickSort
     8     {
     9         static void Main(string[] args)
    10         {
    11             int[] array = { 49, 38, 65, 97, 76, 13, 27 };
    12             sort(array, 0, array.Length - 1);
    13             Console.ReadLine();
    14         }
    15         /**一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
    16           
    17  
    18 **@param array排序数组 
    19           
    20  
    21 **@param low排序起始位置 
    22           
    23  
    24 **@param high排序结束位置
    25           
    26  
    27 **@return单元排序后的数组 */
    28         private static int sortUnit(int[] array, int low, int high)
    29         {
    30             int key = array[low];
    31             while (low < high)
    32             {
    33                 /*从后向前搜索比key小的值*/
    34                 while (array[high] >= key && high > low)
    35                     --high; 
    36                 /*比key小的放左边*/
    37                 array[low] = array[high];   
    38                 /*从前向后搜索比key大的值,比key大的放右边*/
    39                 while (array[low] <= key && high > low)
    40                     ++low; 
    41                 /*比key大的放右边*/
    42                 array[high] = array[low];
    43             }
    44             /*左边都比key小,右边都比key大。//将key放在游标当前位置。//此时low等于high */
    45             array[low] = key;
    46             foreach (int i in array)
    47             {
    48                 Console.Write("{0}	", i);
    49             }
    50             Console.WriteLine();
    51             return high;
    52         }    
    53         /**快速排序 
    54 *@paramarry 
    55 *@return */
    56         public static void sort(int[] array, int low, int high)
    57         {
    58             if (low >= high)
    59                 return; 
    60             /*完成一次单元排序*/
    61             int index = sortUnit(array, low, high); 
    62             /*对左边单元进行排序*/
    63             sort(array, low, index - 1);
    64             /*对右边单元进行排序*/
    65             sort(array, index + 1, high);
    66         }
    67     }
    68 } 
    View Code
    运行结果:27 38 13 49 76 97 65
    13 27 38 49 76 97 65
      13 27 38 49 65 76 97
    快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:
    初始状态 {49 38 65 97 76 13 27} 进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65} 分别对前后两部分进行快速排序{27 38 13} 经第三步和第四步交换后变成 {13 27 38} 完成排序。{76 97 65} 经第三步和第四步交换后变成 {65 76 97} 完成排序。图示
    progress every day !
  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/hghrpg/p/4590445.html
Copyright © 2011-2022 走看看