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

    1 快速排序同合并排序一样 ,采取的是分治策略

    2 合并排序是先分解,合并时处理排序;快速排序是分解之前进行区域划分处理排序(原地排序)

    3 快速排序的运行时间 与 划分数据时 是否对称相关(两个区域的数据数量是否对称)

    4 划分过程需要选取key,通过与key比较划分成两个区域

    5 最坏情况出现在两个区域划分分别为 n-1 个元素 和 0个元素

       最好情况出现在两个区域划分分别为 n/2 和 n/2 - 1 

    6 快速排序最坏情况运行时间比较差n的平方,但其平均性能相当好nlgn(通常比合并排序快3倍以上)

    7 为达到平均性能且不依赖特定的输入,数据划分的key 需要采取 随机化取样的技术获取

     

     1 #include <iostream>
     2 #include <crtdbg.h>
     3 using namespace std;
     4 
     5 //交换数据
     6 void Swap(int array[], int i, int j)
     7 {
     8     int temp = array[i];
     9     array[i] = array[j];
    10     array[j] = temp;
    11 }
    12 //快速排序
    13 void QuickSort(int array[], int size)
    14 {
    15     int last =0;
    16     if (size <= 1)
    17     {
    18         return;  //数组大小 小于1时不再分解
    19     }
    20 
    21     Swap(array,0, rand()%size );//随机化取样,获得关键值key并与array[0]交换
    22     
    23     //进行区域划分与key比较,结果是所有小于key的都在左边,大于key的在右边
    24     for(int i=1; i<size; ++i)
    25     {
    26         if (array[i] < array[0])
    27         {
    28             Swap(array,++last, i);  //小于key的向左移
    29         }
    30     }                               
    31 
    32     //关键值key回到恰当的位置,key的左边小于key,右边大于key
    33     Swap(array, 0, last);
    34 
    35     QuickSort(array, last);   //进行分解,此处last已排好序,不考虑last
    36     QuickSort(array+last+1, size-last-1);    
    37     //两个区域分别为 array[0]~array[last-1] 与 array[last+1] ~array[size-last-1-1]
    38 }
    39 void main()
    40 {
    41     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    42 
    43     int Array[10] = {4, 1, 3, 2, 5, 9, 10, 6, 8, 7};
    44 
    45     QuickSort(Array, 10);
    46 
    47     for (int i= 0 ; i < 10; ++i)
    48     {
    49         cout << Array[i] << "
    ";
    50     }
    51     system("pause");
    52 }

     (转载请注明作者和出处^_*  Seven++ http://www.cnblogs.com/sevenPP/  )

  • 相关阅读:
    【leetcode】图像渲染
    【leetcode】不邻接植花
    052-75
    052-74
    052-73
    052-71
    052-70
    052-69
    052-67
    052-66
  • 原文地址:https://www.cnblogs.com/sevenPP/p/3633815.html
Copyright © 2011-2022 走看看