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

[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序

這篇具有很好參考價(jià)值的文章主要介紹了[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1、常見(jiàn)排序算法

1.1 插入排序基本思想

2、希爾排序

2.1 希爾排序( 縮小增量排序 )

2.1.1 預(yù)排序階段

2.1.2 插入排序階段

2.2 單趟希爾排序

2.2.1 思路分析

2.2.2 代碼實(shí)現(xiàn)

3、希爾排序代碼實(shí)現(xiàn)

4、希爾排序時(shí)間復(fù)雜度

5、希爾排序與插入排序效率對(duì)比

6、希爾排序特性總結(jié)


1、常見(jiàn)排序算法

1.1 插入排序基本思想

直接插入排序是一種簡(jiǎn)單的插入排序法,其基本思想是 :
把待排序的記錄按其關(guān)鍵碼值的大小逐個(gè)插入到一個(gè)已經(jīng)排好序的有序序列中,直到所有的記錄插入完為
止,得到一個(gè)新的有序序列 。
實(shí)際中我們玩撲克牌時(shí),就用了插入排序的思想

[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序,排序算法,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

2、希爾排序

2.1 希爾排序( 縮小增量排序 )

希爾排序法又稱(chēng)縮小增量法。希爾排序法的基本思想是:先選定一個(gè)整數(shù)gap,把待排序文件中所有記錄分成多個(gè)組,所有距離相差為gap的記錄分在同一組內(nèi),并對(duì)每一組內(nèi)的記錄進(jìn)行排序。然后,取gap=gap/3+1重復(fù)上述分組和排序的工作。當(dāng)?shù)竭_(dá)gap=1時(shí),所有記錄在統(tǒng)一組內(nèi)排好序。

我們畫(huà)圖來(lái)分析一下:我們這里是排升序

[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序,排序算法,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

由圖我們其實(shí)可以看出來(lái),當(dāng)最后一次gap=1時(shí),本質(zhì)是插入排序,而希爾排序就是先預(yù)排序,最后再插入排序一次就實(shí)現(xiàn)了排序

我們將上面的圖來(lái)分析一下:

2.1.1 預(yù)排序階段

1、第一趟,當(dāng)gap=5時(shí),意思是每間隔5個(gè)數(shù)為一組,9與4,1與8,2與6,5與3,7與5分為一組,當(dāng)后面的數(shù)字小于前面的數(shù)字我們就交換,這樣我們就將這幾組中小的數(shù)字排到了前面,大的數(shù)字就排到了后面;

2、第二趟,我們就讓gap = gap/3+1(這里gap/3+1是為了最后能得到gap=1,當(dāng)gap<3時(shí),如果只是除以3,得到的就是0,這樣就實(shí)現(xiàn)不了完全排序),gap=2,每間隔2個(gè)數(shù)為一組,4與2,5,8,5一組,1與3,9,6,7一組,比較大小,然后交換;

2.1.2 插入排序階段

3、當(dāng)調(diào)整gap=1時(shí),本質(zhì)就是插入排序了,這時(shí)經(jīng)過(guò)了之前的預(yù)排序階段,我們的數(shù)字已經(jīng)接近有序了,但是不完全有序,此時(shí)上插入排序,效率提升會(huì)很大。

2.2 單趟希爾排序

2.2.1 思路分析

單趟的希爾排序其實(shí)就是將相隔為gap的數(shù)字分為一組,先進(jìn)行排序。

畫(huà)圖分析:

[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序,排序算法,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

將單趟的每個(gè)間隔為gap的數(shù)字分為一組先進(jìn)行排序。

2.2.2 代碼實(shí)現(xiàn)

for (int i = 0; i < n - gap; i++)//多組一起排序(沒(méi)有提升效率,只是少寫(xiě)一組循環(huán))
{
    int end = i;
    int tmp = a[i + gap];
    while (end >= 0)
    {
        if (a[end] > tmp)
        {
            a[end + gap] = a[end];
            end -= gap;
        }
        else
        {
            break;
        }
    }
    a[end + gap] = tmp;
}

3、希爾排序代碼實(shí)現(xiàn)

給單趟排序外面加一層循環(huán),讓gap不斷縮小,直到為 1,就實(shí)現(xiàn)了希爾排序。

void ShellSort(int* a, int n)
{
	//1. 當(dāng) gap > 1 時(shí)先進(jìn)性預(yù)排序
	//2. 當(dāng) gap == 1 時(shí)直接插入排序
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;// +1可以保證最后一次一定是1
		for (int i = 0; i < n - gap; i++)//多組一塊進(jìn)行
		{
			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;
		}
	}
}

4、希爾排序時(shí)間復(fù)雜度

希爾排序的時(shí)間復(fù)雜度不好計(jì)算,因?yàn)間ap的取值方法很多,導(dǎo)致很難去計(jì)算,因此在好些書(shū)中給出的希爾排序的時(shí)間復(fù)雜度都不固定 。

以下是兩本書(shū)對(duì)希爾排序時(shí)間復(fù)雜度的描述:

[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序,排序算法,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

我們這里的gap是按照Knuth提出的方式取值的,而且Knuth進(jìn)行了大量的試驗(yàn)統(tǒng)計(jì),我們暫時(shí)就按照:O(n^1.25)到O(1.6*n^1.25)來(lái)算。

5、希爾排序與插入排序效率對(duì)比

我們分別開(kāi)辟兩個(gè)數(shù)組,都是100000大小,使用希爾排序與插入排序,對(duì)比所消耗的時(shí)間。

//時(shí)間對(duì)比
void TestOp()
{
	srand((unsigned int)time(NULL));
	const int n = 100000;
	int* a1 = (int*)malloc(sizeof(int) * n);
	int* a2 = (int*)malloc(sizeof(int) * n);

	for (int i = 0; i < n; ++i)
	{
		a1[i] = rand();
		a2[i] = a1[i];
	}

	int begin1 = clock();
	InsertSort(a1, n);
	int end1 = clock();

	int begin2 = clock();
	ShellSort(a2, n);
	int end2 = clock();


	printf("InsertSort:%d\n", end1 - begin1);
	printf("ShellSort:%d\n", end2 - begin2);

	free(a1);
	free(a2);
}

int main()
{
	TestOp();
	return 0;
}

[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序,排序算法,排序算法,算法,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言

我們可以看出希爾排序要比插入排序的效率高出很多,當(dāng)數(shù)據(jù)量越大的時(shí)候,希爾排序的更占優(yōu)勢(shì)。

但是,當(dāng)數(shù)組本身就是有序的,希爾排序就比不過(guò)插入排序,因?yàn)橄柵判虼嬖陬A(yù)排序,執(zhí)行了就要花費(fèi)時(shí)間。

6、希爾排序特性總結(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)行性能測(cè)試的對(duì)比。
3. 希爾排序的時(shí)間復(fù)雜度不好計(jì)算,因?yàn)間ap的取值方法很多,導(dǎo)致很難去計(jì)算,因此在好些書(shū)中給出的希爾排序的時(shí)間復(fù)雜度都不固定 。

4。穩(wěn)定性:不穩(wěn)定。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-543428.html

到了這里,關(guān)于[數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(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)文章

  • 數(shù)據(jù)結(jié)構(gòu)修煉第二篇:順序表和鏈表

    數(shù)據(jù)結(jié)構(gòu)修煉第二篇:順序表和鏈表

    第一章 時(shí)間復(fù)雜度和空間復(fù)雜度 第二章 順序表,列表 第三章 棧和隊(duì)列 第四章 二叉樹(shù) 第五章 排序 作者:??樂(lè)言?? 簡(jiǎn)介:??大一學(xué)生,目前在致力于c/c++/python,高數(shù)的學(xué)習(xí),有問(wèn)題盡管問(wèn)我,關(guān)注后私聊! 持續(xù)更新專(zhuān)欄:《c進(jìn)階》,《數(shù)據(jù)結(jié)構(gòu)修煉》 ?? (優(yōu)質(zhì)好文持

    2024年02月02日
    瀏覽(582)
  • 【數(shù)據(jù)結(jié)構(gòu)】手撕排序

    【數(shù)據(jù)結(jié)構(gòu)】手撕排序

    ?? 博客主頁(yè) : 小羊失眠啦. ?? 系列專(zhuān)欄 : 《C語(yǔ)言》 《數(shù)據(jù)結(jié)構(gòu)》 《Linux》 《Cpolar》 ?? 感謝大家點(diǎn)贊??收藏?評(píng)論?? 排序 :所謂排序就是使一串記錄,按照其中的某個(gè)或某些的大小, 遞增或遞減 的排列起來(lái)的操作。排序算法,就是如何使得記錄按照要求

    2024年02月05日
    瀏覽(34)
  • 【夜深人靜學(xué)數(shù)據(jù)結(jié)構(gòu)與算法 | 第二篇】后綴(逆波蘭)表達(dá)式

    【夜深人靜學(xué)數(shù)據(jù)結(jié)構(gòu)與算法 | 第二篇】后綴(逆波蘭)表達(dá)式

    目錄 前言:? 中綴表達(dá)式: ?后綴表達(dá)式: 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式: 后綴表達(dá)式計(jì)算結(jié)果: 總結(jié):? 計(jì)算機(jī)在計(jì)算四則運(yùn)算的時(shí)候,由于括號(hào)以及運(yùn)算優(yōu)先級(jí)的存在,并不能夠很好的處理所有的運(yùn)算,為了處理這種情況,我們引入了后綴表達(dá)式來(lái)優(yōu)化算法。 ????? ??

    2024年02月13日
    瀏覽(33)
  • 【數(shù)據(jù)結(jié)構(gòu)】手撕排序NO.1----排序初識(shí)

    【數(shù)據(jù)結(jié)構(gòu)】手撕排序NO.1----排序初識(shí)

    目錄 ?一. 前言 二. 排序的概念及運(yùn)用 ? ? ? ? 2.1 排序的概念 ? ? ? ? 2.2 排序的運(yùn)用 ? ? ? ? 2.3 常見(jiàn)的排序算法 三.?冒泡and選擇排序 ? ? ? ? 3.1 冒泡排序 ????????3.2 選擇排序 四. 各大排序算法的復(fù)雜度和穩(wěn)定性 ? ? ? ?從本期開(kāi)始,我們的數(shù)據(jù)結(jié)構(gòu)將迎來(lái)一個(gè)新的

    2024年02月16日
    瀏覽(23)
  • [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第三篇] 冒泡排序

    [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第三篇] 冒泡排序

    目錄 1、常見(jiàn)的排序算法 1.1 交換排序基本思想 2、冒泡排序的實(shí)現(xiàn) 2.1 基本思想 2.2 單趟排序 2.2.1 單趟排序分析 2.2.2 單趟排序?qū)崿F(xiàn)代碼 3、冒泡排序完整代碼實(shí)現(xiàn) 3.1 思路分析 3.2 代碼實(shí)現(xiàn) 4、時(shí)間復(fù)雜度 5、優(yōu)化算法 5.1 優(yōu)化算法思路 5.2 優(yōu)化算法代碼實(shí)現(xiàn) 6、冒泡排序的特性總

    2024年02月13日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】手撕歸并排序(含非遞歸)

    【數(shù)據(jù)結(jié)構(gòu)】手撕歸并排序(含非遞歸)

    目錄 一,歸并排序(遞歸) 1,基本思想 ?2,思路實(shí)現(xiàn) 二,歸并排序(非遞歸) 1,思路實(shí)現(xiàn) 2,歸并排序的特性總結(jié): 1,基本思想 歸并排序 (MERGE-SORT) 是建立在 歸并操作 上的一種 有效的排序算法 ,該算法是采用 分治法(Divide and Conquer) 的一個(gè)非常典型的應(yīng)用; 將 已

    2024年02月08日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】手撕排序NO.2----直接插入排序與希爾排序

    【數(shù)據(jù)結(jié)構(gòu)】手撕排序NO.2----直接插入排序與希爾排序

    ? 目錄 一. 導(dǎo)入 二. 直接插入排序 ? ? ? ? 2.1 基本思想 ? ? ? ? 2.2 過(guò)程分析 ????????2.3 代碼實(shí)現(xiàn) ? ? ? ? 2.4 復(fù)雜度/穩(wěn)定性分析 三. 希爾排序(縮小增量排序) ? ? ? ? 3.1 基本思想 ? ? ? ? 3.2 過(guò)程分析? ????????3.3 代碼實(shí)現(xiàn)? ????????3.4 復(fù)雜度/穩(wěn)定性分析 ?

    2024年02月14日
    瀏覽(20)
  • [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序算法第七篇] 遞歸實(shí)現(xiàn)歸并排序

    [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序算法第七篇] 遞歸實(shí)現(xiàn)歸并排序

    目錄 1、歸并的思想 2、歸并排序的思想 2.1 基本思想 2.2 圖解分析 3、歸并排序遞歸版本代碼實(shí)現(xiàn) 3.1 代碼解析 3.2 注意事項(xiàng) 3.2.1錯(cuò)誤劃分:[begin, mid-1],[mid, end] 3.2.2 正確劃分:[begin, mid], [mid+1, end] 4、歸并排序的測(cè)試 5、時(shí)間復(fù)雜度、空間復(fù)雜度分析 5.1 時(shí)間復(fù)雜度 5.2 空間復(fù)雜

    2024年02月16日
    瀏覽(36)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法篇】手撕排序算法之插入排序與希爾排序

    【數(shù)據(jù)結(jié)構(gòu)與算法篇】手撕排序算法之插入排序與希爾排序

    ???內(nèi)容專(zhuān)欄:《數(shù)據(jù)結(jié)構(gòu)與算法篇》 ??本文概括: 講述排序的概念、直接插入排序、希爾排序、插入排序和希爾排序的區(qū)別。 ??本文作者:花 碟 ??發(fā)布時(shí)間:2023.6.13 排序 :所謂排序,就是使一串記錄,按照其中的某個(gè)或某些的大小,遞增或遞減的排列起來(lái)的

    2024年02月09日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法

    數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法

    為什么要學(xué)習(xí)排序算法? 根據(jù)統(tǒng)計(jì),早起大型機(jī)CPU資源的四分之一都花在了數(shù)據(jù)排序上面。排序算法作為最基礎(chǔ)的算法,各種操作系統(tǒng)、編程語(yǔ)言都提供了內(nèi)置的實(shí)現(xiàn)。既然排序?qū)崿F(xiàn)隨處可見(jiàn),我們?yōu)槭裁催€要自己動(dòng)手實(shí)現(xiàn)呢?雖然經(jīng)典算法要?jiǎng)邮謱?xiě)寫(xiě)加深印象的道理都懂,

    2023年04月16日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包