voidmerge_sort_recursive_core(std::vector<int>& nums, int beg, int end){ if (beg >= end) return; int mid = beg + (end - beg) / 2; merge_sort_recursive_core(nums, beg, mid); merge_sort_recursive_core(nums, mid+1, end); std::vector<int> left_sub_arr(nums.begin()+beg, nums.begin()+mid+1); std::vector<int> right_sub_arr(nums.begin()+mid+1, nums.begin()+end+1); int i = beg, left_idx = 0, right_idx = 0; while (left_idx <= mid-beg && right_idx <= end-mid-1) { nums[i++] = left_sub_arr[left_idx] < right_sub_arr[right_idx] ? left_sub_arr[left_idx++] : right_sub_arr[right_idx++]; } while (left_idx <= mid-beg) { nums[i++] = left_sub_arr[left_idx++]; } while (right_idx <= end-mid-1) { nums[i++] = right_sub_arr[right_idx++]; } }
voidmerge_sort_recursive(std::vector<int>& nums){ int n = nums.size(); merge_sort_recursive_core(nums, 0, n-1); }
循环版本:
voidmerge_sort_loop(std::vector<int>& nums){ int n = nums.size(); for (int seg = 1; seg < n; seg *= 2) { for (int beg = 0; beg < n; beg += seg*2) { int mid = min(n-1, beg+seg-1), end = min(n-1, beg+seg*2-1); std::vector<int> left_sub_arr(nums.begin()+beg, nums.begin()+mid+1); std::vector<int> right_sub_arr(nums.begin()+mid+1, nums.begin()+end+1); int i = beg, left_idx = 0, right_idx = 0; while (left_idx <= mid-beg && right_idx <= end-mid-1) { nums[i++] = left_sub_arr[left_idx] < right_sub_arr[right_idx] ? left_sub_arr[left_idx++] : right_sub_arr[right_idx++]; } while (left_idx <= mid-beg) { nums[i++] = left_sub_arr[left_idx++]; } while (right_idx <= end-mid-1) { nums[i++] = right_sub_arr[right_idx++]; } } } }
5 快速排序
基本思想
在数组 nums 中,挑选出一个基准数字 pivot,一般为数组头部的数字。使用两个指针 beg 和 end 分别从数组头部和尾部遍历,nums[end] 比 pivot 小者挪至 beg 处,nums[beg] 比 pivot 大者挪至 end 处,从而保证在 beg 和 end 相遇时,相遇位置左侧的所有元素均小于 pivot,相遇位置右侧的所有元素均大于 pivot。之后递归地处理左右两个子数组即可。