[LintCode] Wiggle Sort II 扭动排序之二
排序 II Sort 之二 lintcode
2023-09-11 14:21:37 时间
Given an unsorted array nums, reorder it such that
nums[0] < nums[1] > nums[2] < nums[3]....
Notice
You may assume all input has valid answer.
Example
Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6].
Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2].
Challenge
Can you do it in O(n) time and/or in-place with O(1) extra space?
LeetCode上的原题,请参见我之前的博客Wiggle Sort II。
解法一:
class Solution { public: /** * @param nums a list of integer * @return void */ void wiggleSort(vector<int>& nums) { vector<int> t = nums; int n = nums.size(), k = (n + 1) / 2, j = n; sort(t.begin(), t.end()); for (int i = 0; i < n; ++i) { nums[i] = i & 1 ? t[--j] : t[--k]; } } };
解法二:
class Solution { public: /** * @param nums a list of integer * @return void */ void wiggleSort(vector<int>& nums) { #define A(i) nums[(1 + i * 2) % (n | 1)] int n = nums.size(), i = 0, j = 0, k = n - 1; auto midptr = nums.begin() + n / 2; nth_element(nums.begin(), midptr, nums.end()); int mid = *midptr; while (j <= k) { if (A(j) > mid) swap(A(i++), A(j++)); else if (A(j) < mid) swap(A(j), A(k--)); else ++j; } } };
解法三:
class Solution { public: /** * @param nums a list of integer * @return void */ void wiggleSort(vector<int>& nums) { #define A(i) nums[(1 + i * 2) % (n | 1)] int n = nums.size(), i = 0, j = 0, k = n - 1; int mid = partition(nums, 0, n - 1, n / 2); while (j <= k) { if (A(j) > mid) swap(A(i++), A(j++)); else if (A(j) < mid) swap(A(j), A(k--)); else ++j; } } int partition(vector<int> nums, int l, int r, int rank) { int left = l, right = r, pivot = nums[left]; while (left < right) { while (left < right && nums[right] >= pivot) --right; nums[left] = nums[right]; while (left < right && nums[left] <= pivot) ++left; nums[right] = nums[left]; } if (left - l == rank) return pivot; else if (left - l < rank) return partition(nums, left + 1, r, rank - (left - l + 1)); else return partition(nums, l, right - 1, rank); } };
相关文章
- 内部排序算法:基数排序
- 内部排序算法:归并排序
- Java实现 LeetCode 768 最多能完成排序的块 II(左右便利)
- Java实现 LeetCode 324 摆动排序 II
- Java实现 LeetCode 324 摆动排序 II
- Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)
- Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)
- Java实现 LeetCode 81 搜索旋转排序数组 II(二)
- Java实现 LeetCode 80 删除排序数组中的重复项 II(二)
- Java实现 LeetCode 23 合并K个排序链表
- 八大排序算法的 Python 实现
- 7-crm项目-kingadmin,列表页---排序
- 数据结构和算法-排序算法-选择排序
- LeetCode(81): 搜索旋转排序数组 II
- LeetCode(80):删除排序数组中的重复项 II
- 剑指 Offer II 034. 外星语言是否排序
- LeetCode-462. 最少移动次数使数组元素相等 II【排序】
- 几种常用的排序算法之 JavaScript 实现
- 多目标优化NSGA-II(非支配排序常见于遗传算法)(C语言实现)
- 数学建模学习(91):快速非支配排序的遗传算法(NSGA-II)多目标寻优
- 922. 按奇偶排序数组 II
- 81. 搜索旋转排序数组 II
- 81. 搜索旋转排序数组 II
- 229. 多数元素 II-快速排序加计数统计法
- 1636. 按照频率将数组升序排序-c语言自定义二重排序
- 1024. 视频拼接-快速排序加贪心算法
- 剑指 Offer II 035. 最小时间差-快速排序加数据转换
- 按奇偶排序数组 II
- hibernate 用hql做中文排序
- LeetCode 768. 最多能完成排序的块 II