分治法合并排序
// 归并排序
using namespace std;
// 打印输出
void print(int *arr,int n)
{
for(int i = 0;i < n;++i)
{
cout<<*(arr+i)<<" ";
}
cout<<endl;
}
void Merge(int* arr,int* tempArr,int s,int m,int e)
{
int i = s,j = m+1,k = s;
while(i <= m && j <= e)
{
if(arr[i] <= arr[j] )
tempArr[k++] = arr[i++];
else
tempArr[k++] = arr[j++];
}
while(i<=m) tempArr[k++] = arr[i++];
while(j<=e) tempArr[k++] = arr[j++];
for(int index = s;index <=e;++index)
{
arr[index] = tempArr[index];
}
}
void MergeSort(int* arr,int s,int e)
{
int tempArr[1000] = {0};
if(s == e) return; // 仅含有一个元素,单个元素有序,结束排序
// 设置中间指针m,这样我们有头指针,中间指针,尾指针
int m = (s + e)/2;
MergeSort(arr,s,m);
MergeSort(arr,m+1,e);
Merge(arr,tempArr,s,m,e);
}
// 用std::sort()进行测试归并排序的正确性
void testMergeSort()
{
srand((int)time(NULL)); // 利用系统时钟,生成不同的随机数种子
int flag = 1;
int length;
int* arr1,*arr2;
int times = 10000; // 测试的次数
for(int i = 0;i<times;++i)
{
flag = 1;
length = rand()% 21 + 10; //随机生成长度为10-30之间的数作为数组的长度
arr1 = (int *)malloc(sizeof(int)*length);
arr2 = (int *)malloc(sizeof(int)*length);
for(int i = 0;i < length;++i)
{
arr1[i] = rand()%24;
}
copy(arr1,arr1+length,arr2); // 浅拷贝
cout<<"第"<<setw(4)<<i+1<<"个样例:";
print(arr1,length);
MergeSort(arr1,0,length-1);
sort(arr2,arr2+length);
for(int j = 0;j<length;++j)
{
if(arr1[j]!=arr2[j])
{
flag = 0;
break;
}
}
if(flag == 0) break;
else cout<<"通过======================================================================="<<endl;
free(arr1);arr1 = NULL; // 释放内存
free(arr2);arr2 = NULL; // 释放内存
}
if(flag == 1) cout<<times<<"个测试全部通过"<<endl;
else {
cout<<"样例未通过测试:"<<endl;
free(arr1);arr1 = NULL; // 释放内存
free(arr2);arr2 = NULL;
}
}
int main()
{
int* arr = (int *)malloc(sizeof(int)*N);
srand((int)time(NULL)); // 利用系统时钟,生成不同的随机数种子
for(int i = 0;i < N;++i)
{
arr[i] = rand()%20; // 生成 1-10之间的随机数为*(arr+i)赋值
}
cout<<"排序前,数组为:"<<endl;
print(arr,N);
// cout<<"排序过程:"<<endl;
MergeSort(arr,0,N-1);
cout<<"排序后的结果:"<<endl;
print(arr,N);
free(arr);
arr = NULL;
// 测试
// testMergeSort();
return 0;
}