归并排序,递归,直到只含有一个数据。
#include <iostream>
#include <time.h>
//tdw
using namespace std;
int adata[100] = {0};//测试数据
int atemp[100] = { 0 };//辅助的数组
void MergerArray(int nfirst, int nmid, int nlast)//合并已经排好的数组
{
int i = nfirst;//第一个数组的起始
int j = nmid + 1;//第二个数组的起始
int m = nmid;//第一个数组的个数
int n = nlast;//第二个数组的个数
int k = 0;//
while (i <= m && j <= n)
{
if (adata[i] <= adata[j])
atemp[k++] = adata[i++];
else
atemp[k++] = adata[j++];
}
while (i <= m)
{
atemp[k++] = adata[i++];
}
while (j <= n)
{
atemp[k++] = adata[j++];
}
for (int i = 0; i < k; ++i)
{
adata[nfirst + i] = atemp[i];
}
}
void MergerSort(int nfirst, int nlast)//归并排序
{
if (nfirst < nlast)
{
int nmid = (nfirst + nlast) / 2;
MergerSort(nfirst, nmid);//前半部分
MergerSort(nmid+1, nlast);//后半部分
MergerArray(nfirst, nmid, nlast);//前后两部分排好序,再合并
}
}
int main()
{
srand(time(0));
for (int i = 0;i < 100;++i)
{
adata[i] = i+1;
}
for (int i = 0; i < 100;++i)
{
int temp = rand() % 100;
swap(adata[i], adata[temp]);//随机打乱
}
for (int i = 0; i < 100; ++i)
{
cout << adata[i] << " ";//原数据
}
cout << endl;
MergerSort(0,99);
for (int i = 0; i < 100;++i)
{
cout << adata[i] << " ";//排序后数据
}
return 0;
}