最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言深入探究直接插入排序與希爾排序使用案例講解

 更新時(shí)間:2022年05月23日 09:38:21   作者:Mi?ronin  
算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會(huì)在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言直接插入排序與希爾排序使用的相關(guān)資料,需要的朋友可以參考下

一.直接插入排序

1.1直接插入排序引入

排序是我們生活中經(jīng)常會(huì)面對(duì)的問題,以打撲克牌為例,你摸的手牌肯定是雜亂的,你一定會(huì)將小牌移動(dòng)到大牌的左面,大牌移動(dòng)到小牌的右面,這樣順序就算理好了。這里我們的理牌方法就是直接插入排序。

1.2直接插入排序的核心思想與算法分析

核心思想: 就是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而得到一個(gè)新的記錄數(shù)增1的有序表。

算法分析:

  • 從序列第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序
  • 取出下一個(gè)元素,設(shè)為待插入元素,在已經(jīng)排序的元素序列中從后向前掃描,如果該元素(已排序)大于待插入元素,將該元素移到下一位置。
  • 重復(fù)步驟2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素。
  • 重復(fù)2,3步驟,完成排序。

1.3實(shí)例說明

以12,2,9,8,18,7這幾個(gè)數(shù)字為例,排序過程:

  • 這里三角形表示要插入的值
  • 橫線表示已經(jīng)排好序的數(shù)字
  • j是趟數(shù),是這一趟開始的時(shí)候已排序隊(duì)列的最后一個(gè)值的下標(biāo)。

1.4直接插入排序代碼實(shí)現(xiàn)

代碼如下:

void InsertSort(int* arr, int len)
{
	//assert arr!=NULL
	for (int i = 1; i < len; i++)//一共跑了多少趟  //01234   12345  
	{
		int tmp = arr[i];//待插入的值  
		//j 指向 這一趟開始的時(shí)候的已排序好的隊(duì)列中最后一個(gè)值的下標(biāo)
		int j;
		for (j = i - 1; j >= 0; j--)//這里控制待插入的值和 已排序隊(duì)列的挨著比較(從右向左比較)
		{
			if (arr[j] <= tmp)
			{
				break;//這時(shí)應(yīng)該停下來(lái)
			}
			else
			{
				arr[j + 1] = arr[j];
			}
		}
		arr[j + 1] = tmp;
	}
}

1.5直接插入排序性能分析

時(shí)間復(fù)雜度:

(1)順序排序時(shí),只需比較(n-1)次,插入排序時(shí)間復(fù)雜度為O(n);

(2)逆序排序時(shí),需比較n(n-1)/2次,插入排序時(shí)間復(fù)雜度為O(n^2);

(3)當(dāng)原始序列雜亂無(wú)序時(shí),平均時(shí)間復(fù)雜度為O(n^2)。

空間復(fù)雜度:

插入排序過程中,需要一個(gè)臨時(shí)變量temp存儲(chǔ)待排序元素,因此空間復(fù)雜度為O(1)。

算法穩(wěn)定性:

插入排序是一種穩(wěn)定的排序算法。

二.希爾排序

2.1希爾排序引入

希爾排序其實(shí)就是對(duì)直接插入排序的優(yōu)化,在第一部分我們說過==(1)直接插入排序數(shù)據(jù)越有序,插入的效率就越高;(2)記錄數(shù)比較少時(shí),直接插入的優(yōu)勢(shì)也很明顯。==希爾排序就是根據(jù)這兩個(gè)特點(diǎn)進(jìn)行的優(yōu)化。

2.2希爾排序的核心思想與算法分析

核心思想: 通過一個(gè)不斷縮小的增量序列,對(duì)無(wú)序序列反復(fù)的進(jìn)行拆分并且對(duì)拆分后的序列使用插入排序的。

算法分析:

  1. 先將整個(gè)待排元素序列分割成若干個(gè)子序列(由相隔某個(gè)“增量”的元素組成的);
  2. 分別進(jìn)行直接插入排序,然后依次縮減增量再進(jìn)行排序;
  3. 待整個(gè)序列中的元素基本有序(增量足夠小)時(shí),再對(duì)全體元素進(jìn)行一次直接插入排序;
  4. 完成排序。

2.3實(shí)例說明

以12,2,9,8,5,88,99,10,7,17,77,66,89,10,21為例,排序過程如下:

  • 這里相同顏色的線相同的分組
  • 每次增量取上一次的一半(向下取整)
  • 注意:最后一個(gè)增量值必須等于1才可以

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

代碼如下:

void Shell(int arr[], int len, int gap)//一趟希爾排序
{
	for (int i = gap; i < len; i++)//i++  不是i=i+gap;
	{
		int tmp = arr[i];//待插入的值  
		//j 指向 這一趟開始的時(shí)候的已排序好的隊(duì)列中最后一個(gè)值的下標(biāo)
		int j;
		for (j = i - gap; j >= 0; j = j - gap)//這里控制待插入的值和 已排序隊(duì)列的挨著比較(從右向左比較)
		{
			if (arr[j] <= tmp)
			{
				break;//這時(shí)應(yīng)該停下來(lái)
			}
			else
			{
				arr[j + gap] = arr[j];
			}
		}
		arr[j + gap] = tmp;
	}
}
void ShellSort(int arr[], int len)
{
	int gap[] = { 5, 3, 1 };//
	int gap_len = sizeof(gap) / sizeof(gap[0]);
	for (int i = 0; i < gap_len; i++)
	{
		Shell(arr, len, gap[i]);
	}
}

2.5希爾排序性能分析

時(shí)間復(fù)雜度:

希爾排序的時(shí)間復(fù)雜度依賴于增量序列的函數(shù),當(dāng)n在某個(gè)特定的范圍后最優(yōu)的情況下,希爾排序的時(shí)間復(fù)雜度為O(n ^ 1.3),在最差的情況下,希爾排序的時(shí)間復(fù)雜度為:O(n ^ 2)。

空間復(fù)雜度:

希爾排序的空間復(fù)雜度:O(1)。

算法穩(wěn)定性:

希爾排序并不是一種穩(wěn)定的排序算法。

到此這篇關(guān)于C語(yǔ)言深入探究直接插入排序與希爾排序使用案例講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)類似延時(shí)停頓的打字效果

    C++實(shí)現(xiàn)類似延時(shí)停頓的打字效果

    這篇文章主要介紹的是使用C++實(shí)現(xiàn)類似延時(shí)停頓的打字效果的代碼,非常的簡(jiǎn)單,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • 深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念

    深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念

    我們知道C語(yǔ)言是面向過程的編程語(yǔ)言,C++在C語(yǔ)言的基礎(chǔ)上進(jìn)化出了面向?qū)ο蟮哪P?,而繼承就是面向?qū)ο蟮闹匾獙傩裕旅婢妥屝【巵?lái)和大家詳細(xì)講講吧
    2023-07-07
  • 詳解Qt如何使用QtWebApp搭建Http服務(wù)器

    詳解Qt如何使用QtWebApp搭建Http服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了Qt如何使用QtWebApp搭建Http服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Qt實(shí)現(xiàn)文本編輯器(一)

    Qt實(shí)現(xiàn)文本編輯器(一)

    在Qt中QMainWindow是一個(gè)為用戶提供主窗口程序的類,包含了:菜單欄、工具欄、錨接部件、狀態(tài)欄以及一個(gè)中部件。本文將利用QMainWindow制作一個(gè)文本編輯器,感興趣的可以試一試
    2022-01-01
  • 關(guān)于C++為什么不加入垃圾回收機(jī)制解析

    關(guān)于C++為什么不加入垃圾回收機(jī)制解析

    C++為什么不加入垃圾回收機(jī)制呢?現(xiàn)在肯定還有很多人不太了解,不過沒關(guān)系,下面小編就為大家詳細(xì)的介紹下究竟C++為什么不加入垃圾回收機(jī)制。一起跟隨小編過來(lái)看看吧
    2017-01-01
  • 用C語(yǔ)言實(shí)現(xiàn)2048游戲

    用C語(yǔ)言實(shí)現(xiàn)2048游戲

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語(yǔ)言 指針與二維數(shù)組詳解

    C語(yǔ)言 指針與二維數(shù)組詳解

    本文主要介紹C語(yǔ)言 指針與二維數(shù)組,這里整理了詳細(xì)的資料及示例代碼,有需要的小伙伴可以參考下
    2016-08-08
  • C語(yǔ)言 詳細(xì)講解接續(xù)符和轉(zhuǎn)義符的使用

    C語(yǔ)言 詳細(xì)講解接續(xù)符和轉(zhuǎn)義符的使用

    接續(xù)符是用來(lái)告訴編譯器行為的符號(hào),那編譯器遇到接續(xù)符是什么行為呢,就是去掉接續(xù)符,然后把下一行連接到現(xiàn)在這行上面,轉(zhuǎn)義符是主要用于表示無(wú)回顯字符,也用于表示常規(guī)字符,轉(zhuǎn)義符必須放在單引號(hào)或者雙引號(hào)里面
    2022-04-04
  • C++ 系統(tǒng)String類詳解

    C++ 系統(tǒng)String類詳解

    這篇文章主要介紹了C++的系統(tǒng)String類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • 手把手教你用C語(yǔ)言實(shí)現(xiàn)三子棋

    手把手教你用C語(yǔ)言實(shí)現(xiàn)三子棋

    三子棋是黑白棋的一種。三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。這篇文章就教你如何用C語(yǔ)言實(shí)現(xiàn)三子棋的功能
    2021-08-08

最新評(píng)論

金山区| 克东县| 潜山县| 乌拉特后旗| 新闻| 宁乡县| 航空| 手游| 永丰县| 吉安市| 郎溪县| 五家渠市| 温宿县| 吴堡县| 潼关县| 城固县| 拉孜县| 色达县| 凤山县| 县级市| 江西省| 赤城县| 石首市| 历史| 中山市| 汝阳县| 灵寿县| 河曲县| 陆丰市| 天津市| 中江县| 务川| 巢湖市| 北京市| 邻水| 土默特右旗| 隆林| 日照市| 称多县| 慈溪市| 武陟县|