//自顶向下的归并排序
void mergeSort(std::vector<int>& V, int lo, int hi)
{
if (hi <= lo)
return;
int mid = lo + (hi - lo) / 2;
mergeSort(V, lo, mid); //递归实现数组的切分
mergeSort(V, mid + 1, hi);
merge(V, lo, hi);
}
//数组自身实现排序
void merge(std::vector<int> &V, int lo, int hi)
{
//将v_copy数组"抽象"地分为两段
int mid = lo + (hi - lo) / 2;
int i = lo;
int j = mid + 1;
std::vector<int> v_copy(V);
//记得每次v_copy中遍历元素后,索引i,j要++;
for (int k = lo; k <= hi; ++k) {
if (i > mid)
V[k] = v_copy[j++]; //如果i>mid,表示前段数组已经在v_copy取完了
//现在只要把后段数组的元素放入V即可
else if (j > hi)
V[k] = v_copy[i++]; //当j>hi,理由同上
else if (v_copy[i] < v_copy[j])
V[k] = v_copy[i++]; //此时,前段数组和后段数组还有元素
else
V[k] = v_copy[j++]; //将较小元素放入V
}
}
自顶向下的归并排序
归并排序是一种递归算法,运用了高效的分治思想。
实现部分的细节均在代码中