免费注册 查看新帖 |

Chinaunix

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

[算法] C语言希尔排序算法实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-24 13:43 |只看该作者 |倒序浏览
本帖最后由 jack1007 于 2012-10-24 13:44 编辑

之前纠结半天,还是分开写好理解多了,先写直接插入排序函数,再用插入排序函数进行希尔分组排序。
  1. #include <stdio.h>

  2. void swap(int *a, int *b);
  3. void print_arr(int *arr, int arr_len);
  4. void shellsort(int *arr, int arr_len);
  5. void insertion_sort(int *int_arr, int div_len, int arr_len);

  6. int
  7. main()
  8. {
  9.   int arr[] = {99, 56, 48, 93, 25, 32, 49, 88, 12, 74, 22, 62};
  10.   int arr_len = sizeof(arr) / sizeof(arr[0]);
  11.   print_arr(arr, arr_len);

  12.   shellsort(arr, arr_len);
  13.   print_arr(arr, arr_len);

  14.   return 0;
  15. }

  16. void
  17. insertion_sort(int *arr, int div_len, int arr_len)
  18. {
  19.   int i, j;
  20.   for (i = div_len; i < arr_len; i+=div_len) {
  21.     for (j = i; arr[j] < arr[j - div_len] && j > 0; j-=div_len) {
  22.       swap(&arr[j - div_len], &arr[j]);
  23.       }
  24.     }
  25. }

  26. void
  27. shellsort(int *arr, int arr_len)
  28. {
  29.   int div = arr_len / 2;
  30.   while (div > 0) {
  31.     insertion_sort(arr, div, arr_len);
  32.     div = div / 2;
  33.   }
  34. }

  35. void
  36. swap(int *a, int *b)
  37. {
  38.   int tmp;
  39.   tmp = *a;
  40.   *a = *b;
  41.   *b = tmp;
  42. }

  43. void
  44. print_arr(int *arr, int arr_len)
  45. {
  46.   int i = 0;
  47.   while (i < arr_len) {
  48.     printf("%d ", arr[i]);
  49.     i++;
  50.   }
  51.   printf("\n");
  52. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-10-24 14:14 |只看该作者
div = arr_len / 2;

你这种步进长度是很差的一种步进长度

其实希尔排序的很关键的部分就在于选择一种好的步进长度{:3_204:}

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-10-24 16:11 |只看该作者
反正最后一轮步长=1等于插入排序, 前面的步长随意了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP