zoukankan      html  css  js  c++  java
  • 希尔排序

     在第一篇博客中论述了几种排序的方法,这里再论述一下另外一种排序方法:希尔排序  

     希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版

     

    希尔排序的基本思想是:

    把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。

    随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

     

    如下图所示:

     

       因此,增量的选择很重要,如果增量的选择不合适,时间复杂度依然很高。

        代码实现如下:

     

       

    #include<iostream>
    
    using namespace std;
    
    int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15};
    //书上的版本
    void Shellsort(int A[], int N)
    {
       int i, j, Increment;
       int Tmp;
    
       for(Increment = N / 2; Increment > 0; Increment /= 2 )   //增量的变换
       {
           for (i = Increment; i < N; i++)
    	   {
    	     Tmp = A[i];
    		 for(j = i; j >= Increment; j -= Increment)
    			 if(Tmp < A[j - Increment])
    				 A[j] = A[j - Increment];
    			 else
    				 break;
    		 A[j] = Tmp;
    	   }
       }
    }
    
    //我自己写的版本
    
    void My_Shellsort(int A[], int N)
    {
       int i, j;
       int Increment = N / 2;
       int Tmp;
       while(1 <= Increment)
       {
          for(i = Increment; i < N; ++i)
    	  {
    	     Tmp = A[i];
    
    		 for(j = i - Increment; j >= 0 && Tmp < A[j]; j = j - Increment)
    		 {
    		    A[j + Increment] = A[j];
    		 }
    		 A[j + Increment] = Tmp;
    	  } 
    	  Increment = Increment / 2;
       }
    }
    
    int main ()
    {
    	//Shellsort(A, 13);
    	My_Shellsort(A, 13);
    	for(int i = 0; i != 13; ++i)
    	{
    	   cout << A[i] << "  ";
    	}
    	cout << endl;
    
       return 0;
    }
    

        希尔排序相当于改进版本的插入排序。

         夜深了,,,

          我还要预见几个你,才可以忘记你。

  • 相关阅读:
    python之Queue
    rebase after merge
    Heroku使用note
    Adapter, Proxy, Decrator, and AOP
    How rackup works
    sonar插件实战
    2012rubyconfchina小记
    Sonar安装使用篇
    sonar原理扩展篇
    javascript 实现拖动效果
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/6842373.html
Copyright © 2011-2022 走看看