快速排序的优化随机化快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序的优化随机化快速排序相关的知识,希望对你有一定的参考价值。

这周研究快速排序优化策略,首先是利用随机化对快速排序进行优化。

众所周知,之前的基础快速排序算法,其效率一个关键点就在与划分元素的选取,由于之前一直选取的是第一个元素,所以当遇到特殊输入,比如太大或者太小,就会造成区间划分极度不合理。

引入随机化,就是在每一次划分的时候随机选取一个元素作为关键字,用它来进行划分。由于每一次划分都是随机选取,所以每一次都选到不好的元素概率低,可以作为一个优化的方向。

 

和之前的基础快速排序主要区别有两个

1.首先是partition部分

  利用rand产生随机数  ,其中flag是关键字的下标,通过随机产生; pivotkey是对应该下标的数组元素值,;注意swap部分交换的是flag和high或者low,而不是之前基础快拍的high和low互换;其次就是要注意随机数产生要在low和high的范围之内,可以通过设置偏移量(+low)来实现

 1 int partition(int arr[], int low, int high)
 2 {
 3     
 4     int pivotkey, flag;
 5     flag = (rand() % (high - low)) + low;
 6     pivotkey = arr[flag];
 7     while (low < high)
 8     {
 9         while (low < high && (arr[high] >= pivotkey))
10         {
11             high--;
12         }
13         if (low < high)
14         {
15             swap(arr, flag , high);
16         }
17         while (low < high && (arr[low] <= pivotkey))
18         {
19             low++;
20         }
21         if (low < high)
22         {
23             swap(arr, flag, low);
24         }
25     }
26     return low;
27 }

 

2.swap部分,交换的元素改变了

 1 void swap(int arr[], int &flag, int n)
 2 {
 3     int temp;
 4     //先数组元素交换
 5     temp = arr[flag];
 6     arr[flag] = arr[n];
 7     arr[n] = temp;
 8     //再下标交换
 9     
10     flag = n;
11 }

 

 

 

下面放出完整代码参考:

 1 // 快速排序-随机化优化
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <list>
 7 #include <ctime>
 8 
 9 using namespace std;
10 
11 void swap(int arr[], int &flag, int n)
12 {
13     int temp;
14     //先数组元素交换
15     temp = arr[flag];
16     arr[flag] = arr[n];
17     arr[n] = temp;
18     //再下标交换
19     
20     flag = n;
21 }
22 
23 int partition(int arr[], int low, int high)
24 {
25     
26     int pivotkey, flag;
27     flag = (rand() % (high - low)) + low;
28     pivotkey = arr[flag];
29     while (low < high)
30     {
31         while (low < high && (arr[high] >= pivotkey))
32         {
33             high--;
34         }
35         if (low < high)
36         {
37             swap(arr, flag , high);
38         }
39         while (low < high && (arr[low] <= pivotkey))
40         {
41             low++;
42         }
43         if (low < high)
44         {
45             swap(arr, flag, low);
46         }
47     }
48     return low;
49 }
50 
51 void qsort(int arr[], int low, int high)
52 {
53     int pivot;
54     if (low < high)
55     {
56         pivot = partition(arr, low, high);
57         qsort(arr, low, pivot - 1);
58         qsort(arr, pivot+1, high);
59     }
60 }
61 
62 int _tmain(int argc, _TCHAR* argv[])
63 {
64     int a[6] = { 11, 9, 5, 2, 2,0};        
65 
66     qsort(a, 0, 5);
67 
68     for (int i = 0; i <6; i++)
69     {
70         cout << a[i] << endl;
71     }
72 
73     return 0;
74 }

 

以上是关于快速排序的优化随机化快速排序的主要内容,如果未能解决你的问题,请参考以下文章

随机化快速排序法

快速排序/随机快速排序

随机取基准 快速排序的一种算法也算一种优化

双路快速排序法

快速排序

挖掘算法中的数据结构:O(n*logn)排序算法之 快速排序(随机化二路三路排序) 及衍生算法