日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C++深入淺出講解希爾排序算法的實現(xiàn)_C 語言

作者:安然無虞 ? 更新時間: 2022-07-14 編程語言

插入排序分為兩種:直接插入排序&希爾排序

希爾排序

1.基本思想

希爾排序是在直接插入排序基礎(chǔ)上的優(yōu)化,屬于非常牛掰的一個排序。

核心思想:

  • 先進(jìn)行預(yù)排序,讓數(shù)組接近有序;
  • 直接插入排序

預(yù)排序

預(yù)排序步驟:

分組排,假設(shè)gap==3,間隔為gap的為一組,然后分別使用插入排序的思想對這gap組數(shù)據(jù)進(jìn)行排序

多組間隔為gap的預(yù)排序,gap由大變小,gap越大,大的數(shù)可以越快的到后面,小的數(shù)可以越快得到前面,gap越大,預(yù)排完越不接近有序,gap越小,預(yù)排完越接近有序,gap為1時就是直接插入排序

動圖演示:

預(yù)排序代碼:

		for (int i = 0; i < gap; i++)//有g(shù)ap組需要排
		{
			for (int j = i; j < n - gap; j += gap)//內(nèi)層循環(huán),先排紅,再排綠,最后排藍(lán)
			//注意內(nèi)層循環(huán)的寫法
			{
			//跟直接插入排序很像,不同的是需要使用gap
				int end = j;
				int tmp = a[end + gap];
				while (end >= 0)
				{
					if (a[end] > tmp)
					{
						a[end + gap] = a[end];
						end -= gap;
					}
					else
					{
						break;
					}
				}
				a[end + gap] = tmp;
			}
		}

這是最初的寫法,其實這個代碼是可以優(yōu)化的:

//預(yù)排序優(yōu)化
		for (int i = 0; i < n - gap; i++)
		//把間隔為gap的多組數(shù)據(jù)同時排
		//當(dāng)?shù)絥-gap-1的位置就終止了
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}

2.算法實現(xiàn)

//希爾排序
void ShellSort(int* a, int n)
{
	//一開始初始化gap為n
	int gap = n;
	while (gap > 1)//gap大于1都是預(yù)排序,gap==1時為直接插入排序
	{
		//為保證gap最終結(jié)果為1,可以gap/=2,也可以是gap=gap/3+1;
		gap /= 2;
		//預(yù)排序優(yōu)化
		for (int i = 0; i < n - gap; i++)
		//把間隔為gap的多組數(shù)據(jù)同時排
		//當(dāng)?shù)絥-gap-1的位置就終止了
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

完整代碼:

3.時間復(fù)雜度

希爾排序的時間復(fù)雜度是:O(N*logN)

原文鏈接:https://bit-runout.blog.csdn.net/article/details/124702416

欄目分類
最近更新