zoukankan      html  css  js  c++  java
  • 【算法】QuickSort

    快速排序,时间复杂度O(N*logN),要能熟练掌握!

    以下主要参考http://blog.csdn.net/morewindows/article/details/6684558, 感谢原博主!

    该方法的基本思想是:

    1.先从数列中取出一个数作为基准数。

    2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

    3.再对左右区间重复第二步,直到各区间只有一个数。

    虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:

    先来看实例吧,定义下面再给出(最好能用自己的话来总结定义,这样对实现代码会有帮助)。

    以一个数组作为示例,取区间第一个数为基准数。

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    72

    6

    57

    88

    60

    42

    83

    73

    48

    85

    初始时,i = 0;  j = 9;   X = a[i] = 72

    由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。

    从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++;  这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;

    数组变为:

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    48

    6

    57

    88

    60

    42

    83

    73

    88

    85

    i = 3;   j = 7;   X=72

    再重复上面的步骤,先从后向前找,再从前向后找

    从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;

    从i开始向后找,当i=5时,由于i==j退出。

    此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。

    数组变为:

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    48

    6

    57

    42

    60

    72

    83

    73

    88

    85

    可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

    最后是代码实现:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void QuickSort(int m[], int l, int r) { 
     5     int i = l, j = r, baseNumber = m[l];
     6     
     7     if (l < r)    {
     8         while (i < j)    {
     9             //First Right
    10             while (i < j && m[j] > baseNumber)
    11                 j--;
    12             
    13             if (i < j)
    14                 m[i++] = m[j];
    15                 
    16             //Second Left
    17             while (i < j && m[i] <= baseNumber)
    18                 i++;
    19                 
    20             if (i < j)
    21                 m[j--] = m[i];
    22         }
    23         
    24         m[i] = baseNumber;
    25         QuickSort(m, l, i - 1);
    26         QuickSort(m, i + 1, r);
    27     }
    28 }
    29 
    30 int main()    {
    31     int m[10] = {5, 6, 3, 2, 4, 7, 8, 1, 0, 9};
    32     QuickSort(m, 0, 10);
    33     for (int i = 0; i < 10; i++)
    34         cout << m[i] << " ";
    35         
    36     return 0;
    37 }
  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/QingHuan/p/5039482.html
Copyright © 2011-2022 走看看