快速排序

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/  )

原文地址:https://www.cnblogs.com/sevenPP/p/3633815.html