您的位置:首页 > 运维架构 > Shell

shell排序

2016-03-05 16:42 761 查看
参考这篇文章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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: