1. 程式人生 > >【資料結構】希爾排序(ShellSort)

【資料結構】希爾排序(ShellSort)

 

  • 概念:

希爾排序法,又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數, 把待排序檔案中所有資料分成幾個組,所有距離為gap的資料分在同一組內,並對每一組內的資料進行排序。 然後,去重複上述分組和排序的工作。當到達gap=1時,所有資料在一組內排好序。

  • 演算法思想:

將待排序陣列按照步長gap進行分組,然後對每組的元素利用直接插入排序的方法進行排序;每次將gap折半減小,迴圈上述操作;當gap=1時,利用直接插入,完成排序。

         

  • 具體程式碼:
#include <stdio.h>
#include <stdlib.h>

void ShellSort(int* a, int n)//希爾排序
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0 && a[end]>tmp)
			{
				a[end + gap] = a[end];
				end -= gap;
			}
			a[end + gap] = tmp;
		}
	}
}

void SortTest()
{
	int a[10] = { 5, 2, 4, 6, 1, 3, 8, 7, 9,0 };
	int sz = sizeof(a) / sizeof(a[0]);
	printf("希爾排序:>");
	ShellSort(a, sz);
	PrintArray(a, sz);
}
int main()
{
	SortTest();
	system("pause");
	return 0;
}
  • 特性總結:

      1.希爾排序是對直接插入排序的優化;

      2.當gap> 1時都是預排序,目的是讓陣列更接近於有序。當gap== 1時,陣列已經接近有序的了,這樣就

      會很快。這樣整體而言,可以達到優化的效果。我們實現後可以進行效能測試的對比;

      3.希爾排序的時間複雜度不好計算,需要進行推導,推匯出來平均時間複雜度: O(N^1.3- -N^2)

     4.穩定性:不穩定

     5.敏感性:對資料很敏感,如果陣列已經接近有序,排序效率很高