八大排序算法-shell 排序

基本思想

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

操作方法

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

希尔排序的示例:
这里写图片描述

算法实现

我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n为要排序数的个数
即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

#include<stdio.h>

//直接插入排序
void shellInsertSort(int r[],int n,int dk){
    int i;
    for(i=dk;i<n;i++){
        if(r[i]<r[i-dk]){ //若第i个元素大于i-dk(dk是增量,直接插入排序的增量是1)元素,直接插入。小于的话,移动有序表后插入 
            int j = i-dk;
            int x = r[i];//复制为哨兵,即存储待排序元素  
            while(x<r[j] && j>=0){//查找在有序表的插入位置  
                r[j+dk] = r[j];
                j = j - dk; //元素后移  
            }
            r[j+dk] = x;   //插入到正确位置  
        }
    }
} 
//希尔排序(先按增量d(n/2,n为要排序数的个数进行希尔排序 ) 
void shellSort(int r[],int n){
    int dk;
    dk = n/2;
    while(dk>=1){
        shellInsertSort(r,8,dk);
        dk = dk/2;
    }
} 
//打印 
void print(int r[],int n){
    int i;
    for(i=0;i<n;i++){
        printf("%3d",r[i]);
    }
    printf("\n");
}

int  main(){
    int a[8] = {3,1,5,7,2,4,9,6};
    printf("排序前:\n");
    print(a,8);
    printf("排序后:\n"); 
    //shellInsertSort(a,8,1); //直接插入排序  
    shellSort(a,8);           //希尔插入排序  
    print(a,8);  
    return 0;
} 

执行结果

这里写图片描述

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值