1. 程式人生 > >Shell Sort(希爾排序)

Shell Sort(希爾排序)

int 結構 space out pre soft shel 希爾排序 mil

  這個排序算法很厲害,我個人很喜歡這個算法,但算法的時間復雜度難計。算法對增量(這裏也稱作step(步長))的選擇也需要註意,只記得個希爾增量的最壞情況為O(n^2)、Hibbard增量的最壞情況為O(n^3/2)(書上有證明),書上說Hibbard增量的希爾排序平均情形運行時間基於模擬的結果被認為是O(n^5/4),但暫時沒人證明出這個結果。

  算法的代碼實現有許多種,我就把《數據結構與算法分析》上的代碼用C++敲了幾遍當做學習過了,順便學習C++,記不得的時候再回來復習。

  書《數據結構與算法分析》中給出的代碼如下(希爾增量):

#include <iostream>
#include <vector>
using namespace std;

class ShellSort {
public:
	void shellSort(vector<int>& nums) {
		for(int Increment = (int)nums.size()/2; Increment > 0; Increment /= 2)
			for(int i = Increment; i < (int)nums.size(); i++) {
				int j, temp = nums[i];
				for(j = i; j >= Increment; j -= Increment)
					if(temp < nums[j - Increment])
						nums[j] = nums[j - Increment];
					else
						break;
				nums[j] = temp;
			}
	}
};

int main() {
	vector<int> nums(5);
	ShellSort shellsort;

	for(int i = 0; i < (int)nums.size(); i++)
		cin >> nums[i];

	for(int i = 0; i < (int)nums.size(); i++)
		cout << nums[i] << ‘ ‘;
	cout << endl;

	shellsort.shellSort(nums);

	for(int i = 0; i < (int)nums.size(); i++)
		cout << nums[i] << ‘ ‘;
	return 0;
}

  

Shell Sort(希爾排序)