经典排序之归并排序
r1是辅助数组,r1数组的主要目的是,将r数组进行复制,在其中进行排序,不影响原数组,进行排序将排序后的结果最后赋值给r数组。一层递归结束,返回上一层递归,r[]:原数组、r1[]:辅助数组;s:原数组首地址;m:原数组中心值;t:原数组尾值。都会改变,改变为上一层递归中的值。
注意:这里所谓的数组也是相对的,每层递归中的数组r也是不一样的。
类似于:下面这个图片,每一层归并得类似的对应每一次递归后返回上层的数组情况。
include <iostream>
void Merge(int r[], int r1[], int s, int m, int t)
{
int i = s;
int j = m + 1;
int k = s;
while (i <= m && j <= t)
{
if (r[i] <= r[j])
r1[k++] = r[i++];
else
r1[k++] = r[j++];
}
if (i <= m)
while (i <= m)
r1[k++] = r[i++];
else
while (j <= t)
r1[k++] = r[j++];
for (int n = s; n <= t; n++)
r[n] = r1[n];
}
void MergeSort(int r[], int r1[], int s, int t)
{
if (s < t)
{
int m = (s + t) / 2;
MergeSort(r, r1, s, m);
MergeSort(r, r1, m + 1, t);
Merge(r, r1, s, m, t);
}
}
int main()
{
int r[8] = {10, 3, 5, 1, 9, 34, 54, 565}, r1[8];
MergeSort(r, r1, 0, 7);
for (int q = 0; q < 8; q++)
std::cout << r[q] << std::ends;
return 0;
}