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 ;
}

你可能感兴趣的:(算法,shell,插入排序)