本文主要详细介绍合并排序的C实现。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
本文分享C进行归并排序的具体代码,供大家参考。具体内容如下
一、思路:稳定排序
(1) Partition:调用Partition进程,直到子序列为空或者只有一个元素。Log2 (n)是必需的;
(2)合并:将两个子序列从小到大合并成一个序列。
二、实现程序:
//合并排序:(双向合并)
//(1)递归分解数组;
//(2)合并有序序列
#包括iostream
使用命名空间std
//合并两个有序序列
模板类型名T
void Merge(T arr[],int start,int mid,int end) {
int i,j,k,n1,N2;
k=0;
n1=中期开始1;
n2=末端-中间;
T *L=新T[n1],*R=新T[N2];
for(I=0;i n1I) //将arr的左边部分赋给l。
l[I]=arr[start I];
for(j=0;j n2J) //将arr的右边部分赋给r。
r[j]=arr[mid j 1];
I=0;
j=0;
k=开始;
While(i n1 j n2) {//merge
if(L[i]=R[j]) {
arr[k]=L[I];
我;
}否则{
arr[k]=R[j];
j;
}
k;
}
而(i n1) {//左边部分没有完成。
arr[k]=L[I];
k;
我;
}
而(j n2) {//右边部分没有完成。
arr[k]=R[j];
k;
j;
}
删除[]L;
删除[]R;
}
//合并排序
模板类型名T
void MergeSort(T arr[],int start,int end) {
int mid
if(开始=结束)
返回;
mid=(起始端)/2;
MergeSort(arr,start,mid);
MergeSort(arr,mid 1,end);
Merge(arr,start,mid,end);
}
//输出数组
模板类型名T
void Print(T arr[],int n) {
int I;
for(I=0;I n;我)
cout arr[I]' ';
cout endl
}
int main(int argc,const char * argv[]) {
int n,I,arr[50];
Cout '请输入要排序的数字个数:';
CIN n;
srand((int)time(NULL));//将时间设置为一个随机点
for(I=0;I n;I) //生成N个随机数
arr[I]=rand()% 100;
排序前的“Cout”:
Print(arr,n);
MergeSort(arr,0,n-1);//调用合并排序
排序后的“Cout”:
Print(arr,n);
返回0;
}
测试结果:
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。