数据结构 归并排序

/*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]);
 }
}
*/  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值