归并:
1.详细解释
https://www.cnblogs.com/jingmoxukong/p/4308823.html
2.C++代码
#include<bits/stdc++.h>
using namespace std;
/*元素合并*/
void Merge(int array[], int low, int mid, int high)
{
int i = low; // i是第一段序列的下标
int j = mid + 1; // j是第二段序列的下标
int k = 0; // k是临时存放合并序列的下标
int array2[high - low + 1] ; // array2是临时合并序列
// 扫描第一段和第二段序列,直到有一个扫描结束
while (i <= mid && j <= high)
{
// 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描
if (array[i] <= array[j])
array2[k++] = array[i++];
else
array2[k++] = array[j++];
}
// 若第一段序列还没扫描完,将其全部复制到合并序列
while (i <= mid)
{
array2[k++] = array[i++];
}
// 若第二段序列还没扫描完,将其全部复制到合并序列
while (j <= high)
{
array2[k++] = array[j++];
}
// 将合并序列复制到原始序列中
for (k = 0, i = low; i <= high; i++, k++)
{
array[i] = array2[k];
}
}
void MergePass(int array[], int gap, int length)
{
int i = 0;
// 归并gap长度的两个相邻子表
for (i = 0; i + 2 * gap - 1 < length; i = i + 2 * gap)
{
Merge(array, i, i + gap - 1, i + 2 * gap - 1);
}
// 余下两个子表,后者长度小于gap
if (i + gap - 1 < length)
{
Merge(array, i, i + gap - 1, length - 1);
}
}
/*输出结果*/
void Print(int arr[],int length)
{
for (int i=0;i<length;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
/*排序函数*/
int sort(int list[],int length)
{
for (int gap = 1; gap < length; gap = 2 * gap)
{
MergePass(list, gap, length);
cout<<"gap = "<<gap<<": ";
Print(list,length);
}
}
int main()
{
int array[]={9, 1, 5, 3, 4, 2, 6, 8, 7};
int n=sizeof(array)/sizeof(int);
cout<<"初始序列:";
Print(array,n);
sort(array,n);
}