第一道题,所有排序都适合在这里练习:912. 排序数组
第二道题,使用归并排序思想的题目:148. 排序链表
归并排序的核心思想也是分治,首先通过不断的递归将数组划分成无数的子数组,让两个小的子数组合并成一个有序的子数组,通过不断的归并,获得更多的排序好的子数组,直到他们归并成最终需要排序的大数组,就完成了排序的操作
const int N = 100010
vector<int> tmp(N);
void mergeSort(int l, int r, vector<int>& nums) {
if (l >= r) return;
int mid = (l + r) / 2;
mergeSort(l, mid, nums), mergeSort(mid + 1, r, nums);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r) {
if (nums[i] < nums[j]) tmp[k++] = nums[i++];
else tmp[k++] = nums[j++];
}
while (i <= mid) tmp[k++] = nums[i++];
while (j <= r) tmp[k++] = nums[j++];
for (i = l, k = 0; i <= r; i++, k++) nums[i] = tmp[k];
}
var tmp [100010]int
func mergeSort(l, r int, nums []int) {
if l >= r {
return
}
mid := (l+r)/2
mergeSort(l, mid, nums)
mergeSort(mid+1, r, nums)
k, i, j := 0, l, mid+1
for i <= mid && j <= r {
if nums[i] < nums[j] {
tmp[k] = nums[i]
k++
i++
} else {
tmp[k] = nums[j]
k++
j++
}
}
for i <= mid {
tmp[k] = nums[i]
k++
i++
}
for j <= r {
tmp[k] = nums[j]
k++
j++
}
for i, k := l, 0; i <= r; {
nums[i] = tmp[k]
i++
k++
}
}
用 go 写归并排序,我的评价是,++ 操作真是折磨,C++ 代码看着比较舒适一点,go 代码 ++ 操作多了,真的太冗长了