中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言直接插入排序與希爾排序如何使用

發布時間:2022-05-23 11:21:24 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要講解了“C語言直接插入排序與希爾排序如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言直接插入排序與希爾排序如何使用”吧!

一.直接插入排序

1.1直接插入排序引入

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

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

核心思想: 就是將一個記錄插入到已經排好序的有序表中,從而得到一個新的記錄數增1的有序表。

算法分析:

  • 從序列第一個元素開始,該元素可以認為已經被排序

  • 取出下一個元素,設為待插入元素,在已經排序的元素序列中從后向前掃描,如果該元素(已排序)大于待插入元素,將該元素移到下一位置。

  • 重復步驟2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素。

  • 重復2,3步驟,完成排序。

1.3實例說明

以12,2,9,8,18,7這幾個數字為例,排序過程:

C語言直接插入排序與希爾排序如何使用

  • 這里三角形表示要插入的值

  • 橫線表示已經排好序的數字

  • j是趟數,是這一趟開始的時候已排序隊列的最后一個值的下標。

1.4直接插入排序代碼實現

代碼如下:

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

1.5直接插入排序性能分析

時間復雜度:

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

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

(3)當原始序列雜亂無序時,平均時間復雜度為O(n^2)。

空間復雜度:

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

算法穩定性:

插入排序是一種穩定的排序算法。

二.希爾排序

2.1希爾排序引入

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

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

核心思想: 通過一個不斷縮小的增量序列,對無序序列反復的進行拆分并且對拆分后的序列使用插入排序的。

算法分析:

  1. 先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的);

  2. 分別進行直接插入排序,然后依次縮減增量再進行排序;

  3. 待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序;

  4. 完成排序。

2.3實例說明

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

C語言直接插入排序與希爾排序如何使用

  • 這里相同顏色的線相同的分組

  • 每次增量取上一次的一半(向下取整)

  • 注意:最后一個增量值必須等于1才可以

2.4希爾排序代碼實現

代碼如下:

void Shell(int arr[], int len, int gap)//一趟希爾排序
{
	for (int i = gap; i < len; i++)//i++  不是i=i+gap;
	{
		int tmp = arr[i];//待插入的值  
		//j 指向 這一趟開始的時候的已排序好的隊列中最后一個值的下標
		int j;
		for (j = i - gap; j >= 0; j = j - gap)//這里控制待插入的值和 已排序隊列的挨著比較(從右向左比較)
		{
			if (arr[j] <= tmp)
			{
				break;//這時應該停下來
			}
			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希爾排序性能分析

時間復雜度:

希爾排序的時間復雜度依賴于增量序列的函數,當n在某個特定的范圍后最優的情況下,希爾排序的時間復雜度為O(n ^ 1.3),在最差的情況下,希爾排序的時間復雜度為:O(n ^ 2)。

空間復雜度:

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

算法穩定性:

希爾排序并不是一種穩定的排序算法。

感謝各位的閱讀,以上就是“C語言直接插入排序與希爾排序如何使用”的內容了,經過本文的學習后,相信大家對C語言直接插入排序與希爾排序如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和龙市| 阳城县| 河津市| 河曲县| 廊坊市| 佛学| 新安县| 屏南县| 湾仔区| 凭祥市| 黔西县| 海安县| 普定县| 新平| 沁水县| 上饶市| 苍梧县| 正宁县| 深水埗区| 灯塔市| 郓城县| 泰安市| 遵义市| 平阴县| 象州县| 邵阳市| 五河县| 苏州市| 抚宁县| 田林县| 南靖县| 大厂| 彭山县| 金华市| 禹城市| 巴马| 建始县| 长宁县| 吕梁市| 治县。| 宣威市|