5.插入排序——希尔插入排序

本文针对希尔插入排序。
时间复杂度是随增量序列改变而改变的,希尔序列却没有最好的选择。因此时间复杂度没有确定。

思想是做几次增量不为1的插入排序,使得序列基本有序,最后再做一次增量为1的插入排序。
增量序列选取的时候有一定原则,最后一个元素必须是1,而且所有的值没有公因子。下边给出大神们推荐的3个增量序列

 

程序:

#include <stdio.h>  
#include <stdlib.h>   
  
#define MAXSIZE 50   
#define N 15   
#define P 4   
  
typedef struct{  
    int key;  
    int other;  
}node;  
  
typedef struct  
{  
    node array[MAXSIZE + 1];  
    int length;  
}list;  
  
//做一次希尔排序   
void ShellInsert(list *l,int dk)  
{  
    int i,j;  
      
    for(i = dk + 1;i <= l->length;++i)  
        if(l->array[i].key < l->array[i-dk].key){  
            l->array[0] = l->array[i];  
            for(j = i - dk;j > 0 && l->array[0].key < l->array[j].key;j -= dk)  
                l->array[j + dk] = l->array[j];  
            l->array[j + dk] = l->array[0];  
        }  
}  
  
//希尔排序   
void ShellSort(list *l,int dlta[],int n)  
{  
    int i;  
    for(i = 0;i < n;++i)  
        ShellInsert(l,dlta[i]);  
}  

void print(list *l)  
{  
    int i;  
    for(i = 1;i <= l->length;i++)  
        printf("%d %d\t",l->array[i].key,l->array[i].other);  
    printf("\n");  
}  
  
   
void main()  
{  
    node data[N]={{5,6},{13,5},{22,2},{2,4},{6,5},{99,7},{6,15},{1,22},{15,12},{58,12},{48,40},{26,48},{38,35},{72,58},{61,22}};  
    list l;  
    int i,dt[P]={5,3,2,1};  //增量序列数组   
  
    for(i = 0;i < N;i++)  
        l.array[i + 1] = data[i];  
    l.length = N;  
      
    printf("befor sort:\n");  
    print(&l);  
      
    ShellSort(&l,dt,P);  
    printf("after shell sort:\n");  
    print(&l);  
} 


 

 

 

结果:

[09:57:38]# ./c
befor sort:
5 6     13 5    22 2    2 4     6 5     99 7    6 15    1 22    15 12   58 12   48 40   26 48   38 35   72 58   61 22
after shell sort:
1 22    2 4     5 6     6 15    6 5     13 5    15 12   22 2    26 48   38 35   48 40   58 12   61 22   72 58   99 7


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值