归并操作 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如 设有数列{6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
i=3 [ 1 6 8 38 100 202 301 ] 4
总计: 11次
归并操作的工作原理如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
A[0] | A[1] | A[2] | A[3] | A[4] | A[5] | |
49 | 38 | 65 | 97 | 76 | 13 | 27 |
#include <iostream>
#define MAX 1010
using namespace std;
void mergesort(int a[],int first,int mid,int last)
{
int i = first,j = mid + 1,p = 0;
int b[MAX];
while(i <= mid && j <= last)
{
if(a[i] < a[j])
{
b[p++] = a[i++];
}
else
{
b[p++] = a[j++];
}
}
while(i <= mid)b[p++] = a[i++];
while(j <= last)b[p++] = a[j++];
for(i = 0; i < p; i++)
{
a[i + first] = b[i];
}
}
void merge(int a[],int first,int last)
{
if(first >= last)return;
int mid = first + last;
merge(a,first,mid);
merge(a,mid + 1, last);
mergesort(a,first,mid,last);
}
int main()
{
int n,m;
int i,j;
cin>>n;
int a[MAX];
while(n--)
{
cin>>m;
i = 0;
while(m--)
{
cin>>a[i];
i++;
}
merge(a,0,m-1);
for(j = 0; j < m; j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
return 0;
}