王道考研 ++++ 希尔排序

#include <stdio.h>
#include <stdlib.h>
/*希尔排序*/
int* shellsort(int size,int init,int *list)
{
  int i,j,dk;
  for(dk = init;dk >= 1;dk /= 2)
  {//间隔 每次折半
    for(i = dk+1;i <= size;i++)//第一个间隔之后的元素往前走着排
    {
      list[0] = list[i];//每一次的哨兵
      for(j = i-dk;list[j] > list[0] && j > 0;j -= dk)//比较排序的时候跟前面第dk个比较
        list[j+dk] = list[j];
      list[j+dk] = list[0];
    }
    printf("当dk=%d排序后:",dk);
    for(i = 1;i <= size;i++)
      printf("%d%c",list[i]," \n"[i == size]);
  }
  return list;
}
int main(int argc, char const *argv[]) {
  int *list,size,i,init;
  printf("请输入数组大小:");
  scanf("%d",&size);
  list = (int*)malloc(sizeof(int)*(size+1));
  printf("请输入%d个数字:\n",size);
  for(i = 1;i <= size;i++)
    scanf("%d",&list[i]);
  printf("请输入最初增量(后面增量依次折半):");
  scanf("%d",&init);
  list = shellsort(size,init,list);
  printf("希尔排序结果是:\n");
  for(i = 1;i <= size;i++)
    printf("%d%c",list[i]," \n"[i == size]);
  return 0;
}
/*38 1 23 56 89 0 12 34 56 81 89 8 5 6 8 5 3 1 34 0 76 2 12 56 71 2 58 9 23 45 78 53 5 7 54 17 9 32 5 19*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值