shell排序

参考这篇文章http://blog.csdn.net/gulianchao/article/details/8581210
Shell排序也叫做希尔排序或者缩小增量排序,是DL. Shell于1959年针对直接插入排序算法改进提出的,属于插入排序的范畴,是对直接插入排序算法的改进。直接插入排序在基本有序时效率较高,并且在序列规模不是很大时效率也很高,Shell排序就是针对这两点进行改进。核心思想是:待排序列有n个元素,先取一个小于n的整数h1作为第一个增量,把待排序列以间隔h1分成若干子序列,子序列内使用插入排序;然后取第二个增量h2(< h1),重复上述的划分和排序,直至所取的增量hl = 1 (h1 > h2 > … > hl)。
这样不管序列多么庞大,在先前较大步长分组下每个子序列规模都不是很大,用直接插入效率很高;后面步长变小,子序列变大,但由于整体有序性越来越明显,排序效率依然很高,大大提高了时间效率。

插入排序代码

#include<stdio.h>
void InsertSort(int k[],int n){
    int j = 0 ;
    for(int i=1;i<n;i++){
        if(k[i]<k[i-1]){
            int temp = k[i] ;
            for(j=i-1;k[j]>temp;j--){
                k[j+1] = k[j] ;
            }
            k[j+1] = temp ;
        }
    }
}
int main(){
    int i , a[10] = {5,2,6,0,3,9,1,7,4,8} ;
    InsertSort(a,10) ;
    printf("排序后的结果是: ") ;
    for(i=0;i<10;i++){
        printf("%d ",a[i]) ;
    }
    printf("\n\n") ;
    return 0 ;
}

shell排序代码

//5,2,6,0,3,9,1,7,4,8
//3,      4,      5,
//  2,      8,      9
//    1       6      
//      0       7

//3,2,1,0,4,8,6,7,5,9 
//1,  3,  4,  5,  6,
//  0,  2,  7,  8,  9 

//1,0,3,2,4,7,5,8,6,9
//0,1,2,3,4,5,6,7,8,9

#include<stdio.h>
void InsertSort(int k[],int n){
    int j = 0 ;
    int gap = n ;
    do{
        gap = gap/3 + 1 ;

        for(int i=gap;i<n;i++){
            if(k[i]<k[i-gap]){
                int temp = k[i] ;
                for(j=i-gap;k[j]>temp;j-=gap){
                    k[j+gap] = k[j] ;
                }
                k[j+gap] = temp ;
            }
        }
    }while(gap>1) ;
}
int main(){
    int i , a[10] = {5,2,6,0,3,9,1,7,4,8} ;
    InsertSort(a,10) ;
    printf("排序后的结果是: ") ;
    for(i=0;i<10;i++){
        printf("%d ",a[i]) ;
    }
    printf("\n\n") ;
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值