免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1622 | 回复: 0
打印 上一主题 下一主题

[算法] C语言归并排序算法实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-26 09:59 |只看该作者 |倒序浏览
归并排序主要分两步:
一是将序列分成两份子序列,然后每个子序列再分成两份,如此下去,直到每个序列里面只有一个元素,那么可以认为序列有序了。这个由一个递归功能的mergesort函数实现。
二是完成两个有序子序列合并,在merge函数里面实现。
将两个部分组合起来,就实现了归并排序,mergesort函数实现。
代码如下:
  1. #include <stdio.h>

  2. void print_arr(int *arr, int arr_len);
  3. void merge(int *arr, int left, int midle, int right);
  4. void mergesort(int *arr, int left, int right);

  5. int
  6. main()
  7. {
  8.   int arr[] = {78, 56, 13, 67, 35, 87, 92, 48, 52, 18};
  9.   int arr_len = sizeof(arr) / sizeof(arr[0]);
  10.   print_arr(arr, arr_len);
  11.   mergesort(arr, 0, arr_len - 1);
  12.   print_arr(arr, arr_len);
  13.   return 0;
  14. }

  15. void
  16. merge(int *arr, int left, int midle, int right)
  17. {
  18.   int arr_tmp[right - left + 1];
  19.   int k = 0;
  20.   int i = left;
  21.   int j = midle + 1;
  22.   while (i <= midle && j <= right) {
  23.     if (arr[i] <= arr[j]) {
  24.       arr_tmp[k] = arr[i];
  25.       i++;
  26.       k++;
  27.     } else {
  28.       arr_tmp[k] = arr[j];
  29.       j++;
  30.       k++;
  31.     }
  32.   }
  33.   while (i <= midle) {
  34.     arr_tmp[k] = arr[i];
  35.     i++;
  36.     k++;
  37.   }
  38.   while (j <= right) {
  39.     arr_tmp[k] = arr[j];
  40.     j++;
  41.     k++;
  42.   }
  43.   
  44.   int index = 0;
  45.   while (index < k) {
  46.     arr[left + index] = arr_tmp[index];
  47.     index++;
  48.   }
  49. }

  50. void
  51. mergesort(int *arr, int left, int right)
  52. {
  53.   int midle;
  54.   if (left  < right) {
  55.     midle = (left + right) / 2;
  56.     mergesort(arr, left, midle);
  57.     mergesort(arr, midle + 1, right);
  58.     merge(arr, left, midle, right);
  59.   }
  60. }

  61. void
  62. print_arr(int *arr, int arr_len)
  63. {
  64.   int i = 0;
  65.   while (i < arr_len) {
  66.     printf("%d ", arr[i]);
  67.     i++;
  68.   }
  69.   printf("\n");
  70. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP