希尔排序

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

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

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

     夜深了,,,

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

原文地址:https://www.cnblogs.com/1242118789lr/p/6842373.html