标签:
一. 希尔排序的实质是分组插入排序,又称为缩小增量排序,是不稳定的排序,并且时效分析很难,因为增量选择的关系
二. 思想:将数组按照增量分为若干个子序列分别进行直接插入排序,然后缩减该增量,直到增量等于1,此时该数组基本有序,对该数组进行一次直接插入排序,效率比直接插入高
三. 例子
假设有十个数 num[10]={ 5,7,9,10,23,15,13,67,78,32 }
(1)开始时我们选择增量等于d=len/2=5;此时将数组分为5组,也就是[ i , i+d ]; 0 <= i <= 4;
(2)if( num [i] >num [i+d] ) swap(num [i] , num [i+d] ); 第一次分组插入排序完成
(3)d=d/2=2; 此时将数组分为 2 组 ,然后重复步骤 2 ,进行排序 ,此时该数组基本有序,再进行一次直接插入排序,
(4)d=d/2<=1;已经实现排序
四.代码
1 #include<iostream> 2 using namespace std; 3 void shell_sort(int *a,int len){ 4 //定义增量 5 int d=len; 6 //依次缩小增量,每次缩小一半 7 while(d>1){ 8 d=(d+1)/2; 9 //将他们分为d个组,分别对每个组进行插入排序 10 for(int i=0;i<len-d;i++){ 11 if(a[i]>a[i+d]){ 12 int tmp=a[i]; 13 a[i]=a[i+d]; 14 a[i+d]=tmp; 15 } 16 } 17 for(int i=0;i<len;i++) 18 cout<<a[i]<<" "; 19 cout<<endl; 20 } 21 } 22 int main(){ 23 int a[20]; 24 int N,m,i,j; 25 cin>>N; 26 for(i=0;i<N;i++){ 27 cin>>a[i]; 28 } 29 shell_sort(a,N); 30 for(i=0;i<N;i++) 31 cout<<a[i]<<" "; 32 cout<<endl; 33 return 0; 34 }
标签:
原文地址:http://www.cnblogs.com/jijiji/p/4787946.html