#include <iostream>
#include <time.h>
using namespace std;
void Merge( int* _arr, int p, int q, int r );
void MergeSort( int* _arr, int p, int r );
void Print( int* _arr, int _num );
int main()
{
srand(time(NULL));
int m = 0, Index = 0;
scanf("%d",&m);
int* arr = (int*)malloc( m * sizeof(int) );
while( Index < m )
{
arr[Index] = rand();
++Index;
}
printf("归并排序前\n");
Print(arr,m);
MergeSort( arr, 0, Index-1);
printf("归并排序后\n");
Print(arr,m);
free(arr);
system("pause");
}
void MergeSort( int* _arr, int p, int r )
{
int q;
if( p < r )
{
q = (int)((p+r) / 2);
MergeSort( _arr, p, q ); //_arr[p,q]排序
MergeSort( _arr, q+1, r); //_arr[q+1,r]排序
Merge( _arr, p, q, r); //将_arr[p,q]和_arr[q+1,r]合并并排序
}
}
//将已排序的两部分合并为已排序的新数组 其中p-q和q-r为已排序的
void Merge( int* _arr, int p, int q, int r )
{
int n1 = q - p + 1;
int n2 = r - q;
//将arr[p,q]赋值给arr1,arr[q+1,r]赋值给arr2
int* arr1 = (int*)malloc( (n1) * sizeof(int) );
int* arr2 = (int*)malloc( (n2) * sizeof(int) );
for( int i = 0; i < n1; ++i )
{
arr1[i] = _arr[p+i];
}
for( int k = 0; k < n2; ++k )
{
arr2[k] = _arr[q+k+1];
}
//循环比较arr1和arr2中的元素,将较小值放入arr中直到arr1或者arr2中的元素已经比较完毕
int Index = p,Index1 = 0, Index2 = 0;
while( Index1 < n1 && Index2 < n2 )
{
if( arr1[Index1] < arr2[Index2] )
{
_arr[Index] = arr1[Index1];
Index++;
Index1++;
}
else
{
_arr[Index] = arr2[Index2];
Index++;
Index2++;
}
}
//将arr1或者arr2中剩余的元素放入arr中
while( Index1 < n1 )
{
_arr[Index] = arr1[Index1];
Index++;
Index1++;
}
while( Index2 < n2 )
{
_arr[Index] = arr2[Index2];
Index++;
Index2++;
}
free(arr1);
free(arr2);
}
void Print( int* _arr, int _num )
{
for( int i = 0; i < _num; ++i )
{
printf("%d ",_arr[i]);
}
printf("\n");
}
归并排序
最新推荐文章于 2025-12-18 16:28:22 发布
本文介绍了一个使用C++实现的归并排序算法。该程序通过随机生成整数数组,并利用归并排序进行升序排列,展示了排序过程。文章包含了完整的源代码,便于读者理解和实践。
1839

被折叠的 条评论
为什么被折叠?



