希尔排序

Posted waitforyoull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希尔排序相关的知识,希望对你有一定的参考价值。

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

 希尔(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;
}

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

 

     夜深了,,,

 

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

以上是关于希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)

希尔排序图解与代码

算法-java代码实现希尔排序

希尔排序JAVA代码

《算法》笔记 3 - 选择排序插入排序希尔排序