欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一.直接插入排序

1.1直接插入排序引入

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

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

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

算法分析:

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

1.3實例說明

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

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

1.4直接插入排序代碼實現(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 指向 這一趟開始的時候的已排序好的隊列中最后一個值的下標(biāo)
		int j;
		for (j = i - 1; j >= 0; j--)//這里控制待插入的值和 已排序隊列的挨著比較(從右向左比較)
		{
			if (arr[j] <= tmp)
			{
				break;//這時應(yīng)該停下來
			}
			else
			{
				arr[j + 1] = arr[j];
			}
		}
		arr[j + 1] = tmp;
	}
}

1.5直接插入排序性能分析

時間復(fù)雜度:

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

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

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

空間復(fù)雜度:

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

算法穩(wěn)定性:

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

二.希爾排序

2.1希爾排序引入

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

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

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

算法分析:

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

2.3實例說明

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

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

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

時間復(fù)雜度:

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

空間復(fù)雜度:

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

算法穩(wěn)定性:

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

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

相關(guān)文章

  • C/C++?extern和static的使用詳解

    C/C++?extern和static的使用詳解

    這篇文章主要介紹了C/C++?extern和static的使用,在講到extern和static的時候先了解一下定義和聲明的基本概念,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • C語言用循環(huán)單鏈表實現(xiàn)約瑟夫環(huán)

    C語言用循環(huán)單鏈表實現(xiàn)約瑟夫環(huán)

    這篇文章主要為大家詳細介紹了C語言用循環(huán)單鏈表實現(xiàn)約瑟夫環(huán),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達式的用法

    結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達式的用法

    這篇文章主要介紹了C++中l(wèi)ambda表達式的用法,lambda表達式的引入可謂是C++11中的一大亮點,同時文中也涉及到了C++14標(biāo)準中關(guān)于lambda的一些內(nèi)容,需要的朋友可以參考下
    2016-01-01
  • 深入淺析C++中的#,##,和

    深入淺析C++中的#,##,和

    這篇文章主要介紹了C++中的#,##,和"的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • OpenCV 顏色追蹤的示例代碼

    OpenCV 顏色追蹤的示例代碼

    這篇文章主要介紹了OpenCV 顏色追蹤的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Qt教程之QSqlQueryModel的使用詳解

    Qt教程之QSqlQueryModel的使用詳解

    QSqlQueryModel是QSqlTableModel的父類,它封裝了執(zhí)行SELECT語句從數(shù)據(jù)庫查詢數(shù)據(jù)的功能,本文將為大家介紹一下QSqlQueryModel的使用,需要的可以參考一下
    2022-11-11
  • C++找出字符串中出現(xiàn)最多的字符和次數(shù),時間復(fù)雜度小于O(n^2)

    C++找出字符串中出現(xiàn)最多的字符和次數(shù),時間復(fù)雜度小于O(n^2)

    今天小編就為大家分享一篇關(guān)于C++找出字符串中出現(xiàn)最多的字符和次數(shù),時間復(fù)雜度小于O(n^2),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++自定義數(shù)據(jù)類型方法詳情

    C++自定義數(shù)據(jù)類型方法詳情

    這篇文章主要介紹了C++自定義數(shù)據(jù)類型方法詳情,總結(jié)了兩種方法,分別是typedef聲明和枚舉類型enum,相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容,希望對你的學(xué)習(xí)有所幫助
    2022-03-03
  • C++回調(diào)函數(shù)實現(xiàn)計算器和qsort

    C++回調(diào)函數(shù)實現(xiàn)計算器和qsort

    這篇文章主要介紹了C++回調(diào)函數(shù)實現(xiàn)計算器和qsort,回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)
    2022-08-08
  • C++返回值是類名和返回值是引用的區(qū)別及說明

    C++返回值是類名和返回值是引用的區(qū)別及說明

    這篇文章主要介紹了C++返回值是類名和返回值是引用的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論