希尔排序及C语言实现


  1. #include <stdio.h>  
  2.   
  3. void shell_sort(int arr[], int size)  
  4. {  
  5.     if (arr == NULL)  
  6.         return ;  
  7.     int h = 1; /* 关于步长,取值没有统一标准,必须小于size,最后一次步长要为1 */  
  8.       
  9.     /* 计算首次步长 */  
  10.     while (h < size/3)  
  11.         h = 3*h + 1;  
  12.   
  13.     int i, j, temp;  
  14.     while (h >= 1) {  
  15.         for (i = h; i < size; ++i) {  
  16.             /* 将a[i]插入到a[i-h]、a[i-2h]、a[i-3h]...中 */   
  17.             for (j = i; j >= h && (arr[j] < arr[j-h]); j -= h) {  
  18.                 temp = arr[j];  
  19.                 arr[j] = arr[j-h];  
  20.                 arr[j-h] = temp;  
  21.             }  
  22.         }  
  23.   
  24.         /* 每轮内循环后输出数组的现状 */  
  25.         int k;  
  26.         printf("the step=%d : ", h);  
  27.         for (k = 0; k < size; ++k) {  
  28.             printf("%d ", arr[k]);  
  29.         }  
  30.         printf("\n");  
  31.   
  32.         /* 计算下一轮步长 */  
  33.         h = h / 3;  
  34.     }  
  35.   
  36. }  
  37.   
  38. int main()  
  39. {  
  40.     int arr[] = {6, 5, 3, 1, 8, 7, 2, 4, 9, 0};  
  41.     int size = sizeof(arr) / sizeof(int);  
  42.   
  43.     //sort  
  44.     shell_sort(arr, size);  
  45.   
  46.     //print  
  47.     int i = 0;  
  48.     for (i; i < size; ++i) {  
  49.         printf("%d\n", arr[i]);  
  50.     }  
  51.   
  52.     return 0;  
  53. }  

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值