快速排序

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] << "\n";

50     }

51     system("pause");

52 }

 

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

你可能感兴趣的:(快速排序)