Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23962
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-24 14:12
文章分类

全部博文(15)

文章存档

2014年(15)

我的朋友
最近访客

分类: C/C++

2014-08-30 10:02:52

1、归并排序介绍:2、归并排序代码:
   

点击(此处)折叠或打开

  1. /*=============================================================================
  2. #
  3. # FileName: merge_sort_in_c.c
  4. # Desc: 归并排序
  5. #
  6. # Author: gavinyao
  7. # Email: gavinyao_tencent.com
  8. #
  9. # Created: 2013-12-25 23:55:02
  10. # Version: 0.0.1
  11. # History:
  12. # 0.0.1 | gavinyao | 2013-12-25 23:55:02 | initialization
  13. #
  14. =============================================================================*/
  15. #include <stdio.h>
  16. #include <stdlib.h> // rand sranddev
  17.  
  18. #define DEBUG 1
  19. //#define SORT_NUM 10
  20.  
  21. void print_array(int *list, int len);
  22. void merge_array(int *list1, int list1_size, int *list2, int list2_size);
  23.  
  24. /**
  25.  * @brief 归并排序
  26.  *
  27.  * @param *list 要排序的数组
  28.  * @param n 数组中的元素数量
  29.  */
  30. void merge_sort(int *list, int list_size)
  31. {
  32.     if (list_size > 1)
  33.     {
  34.         // 把数组平均分成两个部分
  35.         int *list1 = list;
  36.         int list1_size = list_size / 2;
  37.         int *list2 = list + list_size / 2;
  38.         int list2_size = list_size - list1_size;
  39.         // 分别归并排序
  40.         merge_sort(list1, list1_size);
  41.         merge_sort(list2, list2_size);
  42.  
  43.         // 归并
  44.         merge_array(list1, list1_size, list2, list2_size);
  45.     }
  46. }
  47.  
  48. /**
  49.  * @brief 归并两个有序数组
  50.  *
  51.  * @param list1
  52.  * @param list1_size
  53.  * @param list2
  54.  * @param list2_size
  55.  */
  56. void merge_array(int *list1, int list1_size, int *list2, int list2_size)
  57. {
  58.     int i, j, k;
  59.     i = j = k = 0;
  60.  
  61.     // 声明临时数组用于存储归并结果
  62.     int *list = (int *)malloc((list1_size + list2_size)*sizeof(int));
  63.  
  64.     // note: 只要有一个数组到达了尾部就要跳出
  65.     // 也就是说只有两个都没有到达尾部的时候才执行这个循环
  66.     while (i < list1_size && j < list2_size)
  67.     {
  68.         // 把较小的那个数据放到结果数组里, 同时移动指针
  69.         list[k++] = list1[i] < list2[j] ? list1[i++] : list2[j++];
  70.     }
  71.  
  72.     // 如果 list1 还有元素,把剩下的数据直接放到结果数组
  73.     while (i < list1_size)
  74.     {
  75.         list[k++] = list1[i++];
  76.     }
  77.  
  78.     // 如果 list2 还有元素,把剩下的数据直接放到结果数组
  79.     while (j < list2_size)
  80.     {
  81.         list[k++] = list2[j++];
  82.     }
  83.  
  84.     // 把结果数组 copy 到 list1 里
  85.     for (int ii = 0; ii < (list1_size + list2_size); ++ii)
  86.     {
  87.         list1[ii] = list[ii];
  88.     }
  89.     free(list);
  90.  
  91. }
  92.  
  93. /**
  94.  * @brief 打印数组
  95.  *
  96.  * @param list[]
  97.  * @param len
  98.  */
  99. void print_array(int *list, int len)
  100. {
  101.     int i;
  102.     for (i = 0; i < len; ++i)
  103.     {
  104.         // printf("%3d", *(list+i));
  105.         printf("%3d", list[i]);
  106.         if (i < len - 1)
  107.             printf(" ");
  108.     }
  109.     printf("\n");
  110. }
  111.  
  112. int main(void)
  113. {
  114.     int i;
  115.     int list[10];
  116.     for(i=0;i<10;i++)
  117.     {
  118.      scanf("%d",&list[i]);
  119.     }
  120.     merge_sort(list, 10);
  121.     print_array(list, 10);
  122.  
  123.     return 0;
  124. }

阅读(496) | 评论(0) | 转发(0) |
0

上一篇:冒泡排序

下一篇:一个可视化排序的网站

给主人留下些什么吧!~~