标签:
这周研究快速排序优化策略,首先是利用随机化对快速排序进行优化。
众所周知,之前的基础快速排序算法,其效率一个关键点就在与划分元素的选取,由于之前一直选取的是第一个元素,所以当遇到特殊输入,比如太大或者太小,就会造成区间划分极度不合理。
引入随机化,就是在每一次划分的时候随机选取一个元素作为关键字,用它来进行划分。由于每一次划分都是随机选取,所以每一次都选到不好的元素概率低,可以作为一个优化的方向。
和之前的基础快速排序主要区别有两个
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 }
标签:
原文地址:http://www.cnblogs.com/cy-leung/p/5982493.html