新手讲排序:希尔排序

一.  希尔排序的实质是分组插入排序,又称为缩小增量排序,是不稳定的排序,并且时效分析很难,因为增量选择的关系

二.  思想:将数组按照增量分为若干个子序列分别进行直接插入排序,然后缩减该增量,直到增量等于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  }
c++希尔排序
原文地址:https://www.cnblogs.com/jijiji/p/4787946.html