/*6 7 3 1 8 4 2 3
将此数组分为 6 7||3 1||8 4||2 3 倒数第一步
进行排序 6 7||1 3||4 8||2 3
再进行拆分 1 3 6 7||2 3 4 8 倒数第二步
1 2 3 3 4 6 7 8
#include<stdio.h>
int a[1000];
int i;
void merge(int a[],int left,int mid,int right)
{
int i,j,k,n1,n2;
int p1[100],p2[100];
n1=mid-left+1;//数组左边部分数字数量
n2=right-mid;// 数组右边部分数字数量
for(i=0;i<=n1;i++)
{
p1[i]=a[left+i];//数组p1记录左边部分数组
}
for(i=0;i<n2;i++)
{
p2[i]=a[mid+i+1];//数组p2记录右边部分数组
}
i=0,j=0,k=left;
while(i<n1&&j<n2)//对两部分数组进行排序,并整合到数组a中
{
if(p1[i]<p2[j])
{
a[k++]=p1[i++];
}
else
{
a[k++]=p2[j++];
}
}
//将剩余的未整合进入数组的整合进去 (在i或j越界说明一部分数组已经排序完成,循环结束,因此需要用另一个循环将另一个数组剩余的部分加入数组a)
while(i<n1)
{
a[k++]=p1[i++];
}
while(j<n2)
{
a[k++]=p2[j++];
}
}
void mergesort(int a[],int left,int right)
{
int mid;
//利用left,right,mid将数组分成多组再进行排序,将一个数组分割为多个数组,每个数组只有两个或一个和元素
//再利用递归多次实现排序过程
if(left<right)
{
mid=(left+right)/2;
mergesort(a,left,mid);
mergesort(a,mid+1,right);
merge(a,left,mid,right);
}
}
int main()
{
int N;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
mergesort(a,0,N-1);
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
}
*/
数据结构 归并排序
最新推荐文章于 2024-08-14 09:00:00 发布