找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4441|回复: 0

归并排序算法(递归实现) flying0033

[复制链接]
发表于 2011-12-16 11:37:27 | 显示全部楼层 |阅读模式
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

  将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
  1. #ifndef MERGESORT_H
  2. #define MERGESORT_H
  3. #include <stdlib.h>
  4. template<class T> inline void MergeSort(T *a,int len) //归并排序算法
  5. {
  6.         T *TR = (T *)malloc(sizeof(T) * len); //动态分配一个额外的存储空间
  7.         MSort(a,TR,0,len-1); //分裂然后调用归并排序
  8.         free(TR); //释放内存
  9. }
  10. template<class T> void Merge(T a[],T TR[],int low,int mid,int high) //归并排序
  11. {
  12.         int i = low;
  13.         int j = mid + 1;
  14.         int k = 0;
  15.         while(i <= mid && j <= high)
  16.         {
  17.                 if(a[i] < a[j])  //进行排序存入动态分配的数组中
  18.                         TR[k++] = a[i++];
  19.                 else
  20.                         TR[k++] = a[j++];
  21.         }
  22.         while(i <= mid) //如果前一半中还有未处理完的数据,按顺序移入动态分配的数组内
  23.                 TR[k++] = a[i++];
  24.         while(j <= high) //如果后一半中还有未处理完的数据,按顺序移入动态分配的数组内
  25.                 TR[k++] = a[j++];
  26.         for(int v = 0,i = low;i <= high;++v,++i) //将排序好的数据移回到原序列中
  27.                 a[i] = TR[v];
  28. }
  29. template<class T> void MSort(T a[],T temp[],int low,int high)
  30. {
  31.         int mid;
  32.         if(low < high)
  33.         {
  34.                 mid = (low + high) / 2; //进行分裂
  35.                 MSort(a,temp,low,mid); //将前一半继续分裂
  36.                 MSort(a,temp,mid + 1,high); //将后一半继续分裂
  37.                 Merge(a,temp,low,mid,high); //进行归并排序
  38.         }
  39. }
  40. #endif //MERGESORT_H
  41. #include "MergeSort.h"
  42. #include <stdio.h>
  43. int main()
  44. {
  45.         int a[] = {20,19,35,33,17,42,15,55,9,5,8,3,1};
  46.         int len = sizeof(a) / sizeof(*a);
  47.         MergeSort(a,len);
  48.         printf("排序后的数组序列:\n");
  49.         for(int i = 0;i < len;++i)
  50.                 printf("%d ",a[i]);
  51.         printf("\n");
  52.         return 0;
  53. }
复制代码
作者:flying0033 发表于2011-12-16 10:22:45 原文链接
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 17:36 , Processed in 0.012287 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表