国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

排序算法-插入/希爾排序

這篇具有很好參考價(jià)值的文章主要介紹了排序算法-插入/希爾排序。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1 插入排序

1.1基本思想:

直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關(guān)鍵碼值的大小逐個(gè)插入到一個(gè)已經(jīng)排好序的有序序列中,直到所有的記錄插入完為止,得到一個(gè)新的有序序列 。

1.2直接插入排序:

當(dāng)插入第i(i>=1)個(gè)元素時(shí),前面的array[0],array[1],…,array[i-1]已經(jīng)排好序,此時(shí)用array[i]的排序碼與 array[i-1],array[i-2],…的排序碼順序進(jìn)行比較,找到插入位置即將array[i]插入,原來位置上的元素順序后移。

直接插入排序的特性總結(jié):
1. 元素集合越接近有序,直接插入排序算法的時(shí)間效率越高
2. 時(shí)間復(fù)雜度:O(N^2)
3. 空間復(fù)雜度:O(1),它是一種穩(wěn)定的排序算法
4. 穩(wěn)定性:穩(wěn)定

?寫排序算法的一種好習(xí)慣就是先寫一個(gè)單趟排序,再使用循環(huán)來實(shí)現(xiàn)整體。假設(shè)實(shí)現(xiàn)一個(gè)升序,首先創(chuàng)建一個(gè)變量end=0,然后tmp保存a[end+1]的值,寫一個(gè)while循環(huán),結(jié)束條件是end<0,進(jìn)入循環(huán)判斷tmp和a[end]的大小,如果tmp小則將a[end]的值覆蓋到a[end+1],然后end--,跳出循環(huán),此時(shí)將tmp插入到a[end+1]也就是a[0]這個(gè)位置。如果tmp>=a[end],直接退出循環(huán)。然后將tmp的值插入到a[end+1]這個(gè)位置。然后最外層套一層循環(huán),每次單趟結(jié)束后end++。

排序算法-插入/希爾排序,數(shù)據(jù)結(jié)構(gòu),C語言,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

// 插入排序
void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int end =i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
			}
			else
			{
				break;
			}
			end--;
		}
		a[end + 1] = tmp;
	}
}

2.希爾排序( 縮小增量排序 )

希爾排序法又稱縮小增量法。希爾排序法的基本思想是: 先選定一個(gè)整數(shù),把待排序文件中所有記錄分成個(gè) 組,所有距離為的記錄分在同一組內(nèi),并對(duì)每一組內(nèi)的記錄進(jìn)行排序。然后取重復(fù)上述分組和排序的工 作。當(dāng)?shù)竭_(dá) =1 時(shí),所有記錄在統(tǒng)一組內(nèi)排好序 。
假設(shè)將下列數(shù)組分為gap=3組,先完成單趟,將end=0,tmp保存a[end+gap]這個(gè)位置的值,進(jìn)行比較,tmp大則將a[end]覆蓋到[end+gap]這個(gè)位置,然后end-gap,退出循環(huán),將tmp插入到a[end+gap]這個(gè)位置,也就是a[0]這個(gè)位置。然后寫一個(gè)循環(huán)控制end的位置,每次end+gap。到這里就完成了黑色的這一組數(shù)據(jù),此時(shí)可以再套一層循環(huán)控制住紅色和藍(lán)色的這兩組數(shù)據(jù)。
排序算法-插入/希爾排序,數(shù)據(jù)結(jié)構(gòu),C語言,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言
void ShellSort1(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int j = 0; j < gap; j++)
		{
			for (int i = j; i < n - gap; i += gap)
			{
				int end = i;
				int tmp = a[end + gap];
				while (end >= 0)
				{
					if (tmp < a[end])
					{
						a[end + gap] = a[end];
						end -= gap;
					}
					else
					{
						break;
					}
				}
				a[end + gap] = tmp;
			}
		}
	}
}

當(dāng)然也可以在單趟外只套一層循環(huán),巧妙地控制i。

void ShellSort2(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		//gap = gap / 2;
		gap = gap / 3 + 1;

		for (int i = 0; i < n - gap; ++i)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}
希爾排序的特性總結(jié):
1. 希爾排序是對(duì)直接插入排序的優(yōu)化。
2. 當(dāng) gap > 1 時(shí)都是預(yù)排序,目的是讓數(shù)組更接近于有序。當(dāng) gap == 1 時(shí),數(shù)組已經(jīng)接近有序的了,這樣就 會(huì)很快。這樣整體而言,可以達(dá)到優(yōu)化的效果。我們實(shí)現(xiàn)后可以進(jìn)行性能測試的對(duì)比。
3. 希爾排序的時(shí)間復(fù)雜度不好計(jì)算,因?yàn)?/span> gap 的取值方法很多,導(dǎo)致很難去計(jì)算,因此在好些樹中給出的 希爾排序的時(shí)間復(fù)雜度都不固定。

排序算法-插入/希爾排序,數(shù)據(jù)結(jié)構(gòu),C語言,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言排序算法-插入/希爾排序,數(shù)據(jù)結(jié)構(gòu),C語言,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

4. 穩(wěn)定性:不穩(wěn)定 ?。


今天的分享到這里就結(jié)束了,感謝大家的閱讀!文章來源地址http://www.zghlxwxcb.cn/news/detail-754099.html

到了這里,關(guān)于排序算法-插入/希爾排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包