快速排序
快速排序算法
1.算法的思想
对输入的数组 a[i , j] 进行排序:
1) 分解:将输入的数组分解成三部分—— a[i , k - 1], a[k] 和 a[k + 1 , j],使得a[i , k - 1]中的元素不大于(或者小于)a[k],a[k + 1, j]中的元素大于(或者不小于)a[k];
2) 递归求解:对于每部分递归调用快速排序算法,进行排序;
2. 算法的实现
template<class T> int Partition(T a[], int left, int right) { T x = a[left]; while(left < right){ while( a[right] >= x && left < right) right--; if(left < right) a[left++] = a[right]; while( a[left] <= x && left < right) left++; if(left < right) a[right--] = a[left]; } a[right] = x; return right; } template<class T> void QuickSort(T a[], int left, int right) { if(left < right){ int temp = Partition(a, left, right); QuickSort(a, left, temp - 1); QuickSort(a, temp + 1, right); } }
3. 算法分析
快速排序算法的最好时间复杂度为Ο(nlog(n)),此时为每次所取的基准恰好为中值,其平均时间复杂度为Ο(nlog(n))。但当基准处于数据的极端时,如本次排序的最大值或者最小值,会增大时间复杂度。最坏的情况下,输入的数据恰好是有序的,此时的时间复杂度为Ο(n2)。
4. 算法的改进
对于快速排序算法中出现的最坏时间复杂度,可以通过改变基准来减少该情况的发生。原始的快排每次选择的基准为该次排序的第一个数据,可以对此进行修改,在选择基准之前生成一个随机数r(left <= r <= right),然后将随机数位置对应的数据与该次排序的第一个数据进行交换,可以有效地减少排序时出现极端的情况。
If you want to build your world,just do it.
posted on 2016-10-07 11:53 JackTheRipper 阅读(264) 评论(0) 收藏 举报
浙公网安备 33010602011771号