improved partition in quick sort
2017-09-29 10:15
375 查看
original solution
参考算法导论实现的分组算法int partition(vector<int>& nums, int p, int r) { int x = nums[r]; int s = p - 1; // the last smaller for (int k = p; k < r; ++k) { if (nums[k] <= x){ ++s; swap(nums[s], nums[k]); } } ++s; swap(nums[r], nums[s]); return s; }
输入
5 2 4 7 5 1 5 9 5 10 5
分组结果
7
5 2 4 5 1 5 5 5 7 10 9
输入
5 5 5 5 5
分组结果
4
5 5 5 5 5
可以看到,第二组输入的分组结果很不均衡,这在会影响快排算法的性能。
improved solution1
在做分组的时候,同时区分大于和小于pivot值的元素。小于pivot值的元素就往左边放,大于pivot值的元素就往右边放,等于pivot的元素放中间。partition结束之后,返回等于pivot值的元素的中间位置。int partition(vector<int>& nums, int p, int r) { int x = nums[r]; int s = p - 1; // the last smaller int cnt = 0; // count # number equals to pivot for (int k = p; k < r; ++k) { if (nums[k] < x){ swap(nums[s+cnt+1], nums[k]); swap(nums[s+cnt+1], nums[s+1]); ++s; } else if (nums[k] == x) { swap(nums[s+cnt+1], nums[k]); swap(nums[s+cnt+1], nums[s+1]); ++cnt; } } swap(nums[r], nums[s+cnt+1]); return s+1+cnt/2; }
输入
5 2 4 7 5 1 5 9 5 10 5
分组结果
5
2 4 1 5 5 5 5 5 7 10 9
输入
5 5 5 5 5
分组结果
2
5 5 5 5 5
改进的代码的均衡性就好多了。
improved solution2
把较小的数往左边放,较大的数放右边。// partition array, return the index of pivot int partition(vector<int>& nums, int p, int r) { int x = nums[r]; int s = p - 1; // the last smaller int l = r; // the first larger for (int k = p; k < l; ++k) { if (nums[k] > x) { --l; swap(nums[l], nums[k]); --k; // nums[k] is new, should do again } else if (nums[k] < x){ ++s; swap(nums[s], nums[k]); } } swap(nums[r], nums[l]); return (s+1+l)/2; }
测试输入
5 2 4 7 5 1 5 9 5 10 5
分组结果
5
2 4 1 5 5 5 5 5 10 7 9
测试输入
5 5 5 5 5
分组结果
2
5 5 5 5 5
相关文章推荐
- What does Quick Sort look like in Python?
- Quick Sort In Haskell
- Summation Prove (Intro. to Algo. Open Course Episode 5) in Quick Sort
- quick sort in golang
- Algorithm: quick sort implemented in python 算法导论 快速排序
- How_to_design_partition_key_in_cassandra
- Algorithm: Quick Sort Mind and Related Questions
- 快速排序在Top k问题中的运用(quickSort and quickSelect in Top k)
- How to Mount and Unmount Filesystem / Partition in Linux (Mount/Umount Command Examples)
- Python——numpy排序(sort、argsort、lexsort、partition、sorted)
- How to sort an NSMutableArray with custom objects in it?
- c++中的quick_sort
- Making Quick macroScripts in 3DS Max
- 排序算法的时间复杂度比较(quick_sort;bubble_sort)
- SQL2008数据压缩功能之一瞥(A Quick Look At Compression In SQL 2008)
- improved mergesort
- leetcode_Sort a linked list in O(n log n) time using constant space complexity.
- partition encryption in LVM
- my quick sort
- Sort a dictionary by value in JavaScript