码迷,mamicode.com
首页 > 编程语言 > 详细

分治法排序之归并排序

时间:2016-07-11 11:54:40      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

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

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

如果子序列较长,还可继续细分,直到子序列的长度不超过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;
}

分治法排序之归并排序

标签:

原文地址:http://www.cnblogs.com/changgong391/p/5659511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!