常見排序算法:希爾排序算法

基本思想:對待排序的數據進行一個分組,對每個組進行插入排序,分組增量取delta=delta/3+1。每個組插入排序完成後再進行總的插入排序。

原理:

1.delta初始爲length,進入while(delta>1)循環,獲取每次的增量:delta=delta/3+1=3;即取出a[3]與a[6]。同時將a[0]作爲插入排序的基本數。

2.將取出的元素進行插入排序。j指向a[3]。若a[j]<a[j-delta],將a[j]放入temp。k指向a[0]。移動k指針依次與temp進行比較。 若a[k]>temp。則a[k+delta]=a[k]。

3.當k指針小於0或者a[k]>temp則跳出循環,將a[k+delta]=temp。完成第一輪的插入排序,依次移動j指針進行剩下的插入排序。

 4.當第一組完成排序後。進行第二組排序,此時delta爲3,i=1。取出a[i+delta]。進行第二組的插入排序。

5.第二組排序完成後,此時delta爲3,i=2,取出a[i+delta]。進行第三組插入排序。

6.當第三組排序完成後。i=3跳出循環。delta進行更新,delta=delta/3+1=2,開始新一輪分組。i=0,取出a[i+delta],進行插入排序。

7.第一輪排序完成後,delta=2,i=1,取出a[i+delta]。 完成新一輪排序。

8.完成後i=2此時i=delta跳出循環。更新delta=delta/3+1=1;for(i=0;i<delta;i++)進行新一輪分組插入排序。

代碼:

//希爾排序
void ShellSort(int list[],int length)
{
	int delta = length;
	int k;
	while (delta>1)
	{
		delta = delta / 3 + 1;//確定分組增量
		for (int i = 0; i < delta; i++)//對每次分組進行排序
		{
			for (int j = i + delta; j < length; j += delta)//
			{
				if (list[j] < list[j - delta])
				{
					int temp = list[j];
					for (k = j - delta; k >= 0 && temp < list[k]; k -= delta)
					{
						list[k + delta] = list[k];
					}
					list[k + delta] = temp;
				}
			}
		}
	}
}

int main()
{
	int list[] = { 12, 5, 4, 6, 7, 6, 1 };

	ShellSort(list, sizeof(list) / sizeof(int));

	for (int i = 0; i < sizeof(list) / sizeof(int); i++)
	{
		cout << list[i] << endl;
	}
}

希爾排序是一種不穩定的排序算法,最好、最壞時間複雜度:O(n^{1\sim 2}),平均時間複雜度:O(n\log n),空間複雜度爲O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章