1. 程式人生 > >希爾排序

希爾排序

shells 思想 .com 復雜度 i++ 排序。 算法 時間復雜度 -1

在第一篇博客中論述了幾種排序的方法,這裏再論述一下另外一種排序方法:希爾排序

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

   希爾排序相當於改進版本的插入排序。

夜深了,,,

我還要預見幾個你,才可以忘記你。

希爾排序