分治法排序之归并排序

使用分治法的两路合并排序算法:

将待排序的元素序列一分为二,得到长度基本相等的两个子序列,分别排序。

如果子序列较长,还可继续细分,直到子序列的长度不超过1为止。

当分解所得的子序列已排列有序时,将两个有序子序列合并成一个有序子序列,得到原问题的解。

合并方法:

比较两序列中的最小值,输出其中较小者,然后重复此过程,直到其中一个队列为空时,

如果另一个队列还有元素没有输出,则将剩余元素依次输出。

#include<stdio.h>
#define N 100
int merge(int *a, int left,int mid,int right)
{
  int i,j,k=0;
  int b[N]={0};
  i=left;
  j=mid+1;
  while(i<=mid&&j<=right) /*把两个序列中小的部分先输入到中间数组*/
  {
    if(a[i]<a[j])
      b[k++]=a[i++];
    else
      b[k++]=a[j++];
  }
  while(i<=mid) /*没有输完的序列剩下的依次输入到中间数组*/
    b[k++]=a[i++];
  while(j<=right)
    b[k++]=a[j++];
  for(i=0;i<k;i++) /*将排序好的出处在中间数组里的序列输入到a数组*/
    a[left++]=b[i];
  return 0;
}
int mergesort(int *a,int left,int right) /*将序列划分为等大的两部分再调用排序*/
{
  int i,j,mid;
  if(right-left>=1)
  {
    mid=(left+right)/2;
    mergesort(a,left,mid);
    mergesort(a,mid+1,right);
    merge(a,left,mid,right); /*调用排序*/
  }
  return 0;
}
int main()
{
  int a[N]={0},i,n;
  printf("please input the length of the list:\n");
  scanf("%d",&n);
  printf("please input the number of the list:\n");
  for(i=0;i<n;i++)
    scanf("%d",&a[i]);
  mergesort(a,0,n-1);
  printf("the sort of the list is :\n");
  for(i=0;i<n;i++)
    printf("%d ",a[i]);
  printf("\n");
  return 0;
}

转载于:https://www.cnblogs.com/changgong391/p/5659511.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值