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