1. 程式人生 > >c++實現希爾排序

c++實現希爾排序

希爾排序(Shell Sort),也稱為遞減增量排序演算法,是插入排序的一種高速而穩定的改進版本。希爾排序是基於插入排序的以下兩點性質而提出改進方法的:1.插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率;2.但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位。

希爾排序的一般步驟為:
1.先取一個小於n的整數d1作為第一個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同一個組中,在各組內進行直接插人排序。
2.取第二個增量d2<d1重複上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。
步長的選擇是希爾排序的重要部分。只要最終步長為1任何步長序列都可以工作。演算法最開始以一定的步長進行排序。然後會繼續以一定步長進行排序,最終演算法以步長為1進行排序。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。

平均時間複雜度:O(nlogn)
穩定性:不穩定

//希爾排序是直接插入排序的改進,它的插入增量可以變化,增量為2的shell排序的時間代價可以達到θ(n的3/2次方),有的增量可以達到θ(n的7/6次方),很接近θ(n)。
//將距離某個增量的子序列分割後,分別進行直接插入排序排序。
#include <iostream>
using namespace std;
void ShellSort(int array[], int n)
{
	int i, j;
	int increment = n;
	do
	{
		increment = increment / 3 + 1;//增量序列
		for (i = increment + 1; i <= n; i++)
		{
			if (array[i] < array[i - increment])
			{
				array[0] = array[i];
				for (j = i - increment; j>0 && array[0] < array[j]; j -= increment)
					array[j + increment] = array[j];
				array[j + increment] = array[0];
			}
		}
	} 
	while (increment>1);
}
void main()
{
	int arr[10];
	cout << "請輸入要排序的元素:" << endl;
	for (int i = 0; i < 10; i++)
	{
		cin >> arr[i];
	}
	//cout << "排序前的無序陣列元素" << arr[i] << endl;
	ShellSort(arr, 10);
	cout << "排序後的陣列元素" << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
	system("pause");
}