Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356947
  • 博文数量: 158
  • 博客积分: 52
  • 博客等级: 民兵
  • 技术积分: 613
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-27 11:58
文章分类

全部博文(158)

文章存档

2017年(1)

2016年(5)

2015年(19)

2014年(8)

2013年(13)

2012年(80)

2011年(32)

分类:

2012-06-02 22:18:20

原文地址:归并排序算法 作者:hfm_honey

算法思想:假设初始序列含有n个记录,首先将这n个记录看成n个有序的子序列,每个子序列的长度为1,然后两两合并,得到[n/2]个长度为2(n为奇数时,最后一个序列的长度为1)的有序子序列。
在此基础上再对长度为2的有序子序列进行两两合并,得到若干个长度为4的有序子序列。
如此重复,直到得到一个长度为n的有序子序列。
测试代码如下所示:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. void Merge(int a[],int low,int mid,int high,int a3[])
  3. {
  4.     int i=low,j=mid+1,k=low;
  5.     while((i<=mid)&&(j<=high))
  6.     {
  7.         if(a[i]<=a[j])
  8.         {
  9.             a3[k]=a[i];
  10.             i++;
  11.         
  12.         }
  13.         else
  14.         {
  15.             a3[k]=a[j];
  16.             j++;
  17.         
  18.         }
  19.         k++;
  20.     
  21.     }
  22.     while(i<=mid)
  23.     {
  24.         a3[k]=a[i];
  25.         k++;
  26.     
  27.         i++;
  28.          
  29.     }
  30.     while(j<=high)
  31.     {
  32.         a3[k]=a[j];
  33.         j++;
  34.         k++;

  35.     }
  36. }
  37. void MSort(int a[],int low,int high,int a1[])
  38. {
  39.     int a2[100];//辅助空间
  40.     int mid;
  41.     if(low==high) a1[low]=a[low];
  42.     else
  43.     {
  44.         mid=(low+high)/2;
  45.         MSort(a,low,mid,a2);//将数组a[]中的前半段的记录用归并法排序后放入a2[]数组的前半段
  46.         MSort(a,mid+1,high,a2);//将数组a[]中的后半段的记录用归并法排序后放入a2[]的后半段
  47.         Merge(a2,low,mid,high,a1);//将a2[]的前半段和后半段利用归并排序放入到a1[]数组中
  48.     }
  49.     
  50. }
  51. void main()
  52. {
  53.     int a[100];
  54.     int a1[100];
  55.     int length;
  56.     int i;
  57.     scanf("%d",&length);
  58.     for(i=1;i<=length;i++)
  59.         scanf("%d",&a[i]);
  60.     MSort(a,1,length,a1);
  61.     for(i=1;i<=length;i++)
  62.         printf("%3d",a1[i]);
  63.     printf("\n");
  64. }
虽然说快速排序,堆排序比归并排序要简单一点儿,但是快速排序及堆排序都是不稳定的排序,而归并排序是稳定的排序算法。快速排序、堆排序和归并排序的平均时间复杂度均为(nlogn),但实验结果表明,就平均
时间性能而言,快速排序是所有排序算法中最好的,可是遗憾的是,快速排序在最坏情况下的时间性能为
O(n^2),而堆排序和归并排序的最坏时间性能仍为(nlogn),当n较大时,归并排序的性能优于堆排序,但它所需要的辅助空间最多。
 
 

 
阅读(499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~