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

c++實(shí)現(xiàn)排序算法之希爾排序方式

 更新時(shí)間:2022年07月20日 10:56:59   作者:卻道天涼_好個(gè)秋  
這篇文章主要介紹了c++實(shí)現(xiàn)排序算法之希爾排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

排序算法之希爾排序

基本思想

將相距某個(gè)“增量”的記錄組成一個(gè)子序列,這樣才能保證在子序列內(nèi)分別進(jìn)行直接插入排序后得到的結(jié)果是基本有序的而不是局部有序。

進(jìn)一步理解:

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

希爾排序算法

#include <iostream>
using namespace std;?
void shellSort(int arr[], int n)
{
?? ?int tmp = 0;
?? ?int step = n / 2;
?? ?while (step)
?? ?{
?? ??? ?for (int i = step; i < n; i++)
?? ??? ?{
?? ??? ??? ?tmp = arr[i];
?? ??? ??? ?int j = i;
?? ??? ??? ?while (j >= step && tmp < arr[j - step]) ? //采用直接插入排序
?? ??? ??? ?{
?? ??? ??? ??? ?arr[j] = arr[j - step];
?? ??? ??? ??? ?j -= step;
?? ??? ??? ?}
?
?? ??? ??? ?arr[j] = tmp;
?? ??? ?}
?
?? ??? ?step = step / 2;
?? ?}
}
?
int main()
{
?? ?int arr[]{ 3, 14, 25, -22, -3, 87, 126, 34, 64, -70, 15, 17, 78 };
?? ?int n = sizeof(arr) / sizeof(arr[0]);
?? ?shellSort(arr, n);
?? ?for (int i = 0; i < n; i++)
?? ??? ?cout << arr[i] << " ";
?
?? ?system("pause");
? ? return 0;
}

復(fù)雜度分析

當(dāng)增量為1(step = 1)時(shí),希爾排序退化成了直接插入排序,此時(shí)的時(shí)間復(fù)雜度為O(N²);

Hibbard增量的希爾排序的時(shí)間復(fù)雜度O(n^3/2);

關(guān)于希爾排序的問(wèn)題分析

排序算法之希爾排序及時(shí)間復(fù)雜度分析

希爾排序

算法思想:將整個(gè)待排序列分割成若干個(gè)子序列(由相隔增量個(gè)元素組成),分別進(jìn)行直接插入排序,然后依次縮小增量再進(jìn)行排序,待整個(gè)序列中的元素基本有序時(shí),再對(duì)全體元素進(jìn)行一次直接插入排序。

希爾排序的實(shí)現(xiàn)應(yīng)該由三個(gè)循環(huán)完成

(1)第一次循環(huán),將增量d依次折半,直到增量d=1

(2)第二三層循環(huán),也就是直接插入排序所需要的兩次循環(huán)。

算法實(shí)現(xiàn):

#include <stdio.h>
#define N 9
int main(void)
{
	int arr[N] = {9,1,5,8,3,7,4,6,2};
	int d = N / 2; //增量先取一半
	int i,j,insertVal;
	//希爾排序三層循環(huán)
	while(d>=1) //當(dāng)增量大于等于1,不斷進(jìn)行插入排序
	{
		//一下兩層for循環(huán)是直接插入排序代碼
		for(i=d; i<N; i++)
		{
			insertVal = arr[i];
			j = i - d;
			while(j>=0 && arr[j]>insertVal)
			{
				arr[j+d] = arr[j];
				j = j - d;
			}
			arr[j+d] = insertVal;
		}
		d = d / 2;
	}
	for(i=0; i<N; i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

由如上代碼知,希爾排序的關(guān)鍵并不是隨便分組后各自排序,而是將相隔某個(gè)增量的記錄組成一個(gè)子序列,實(shí)現(xiàn)跳躍式移動(dòng),使得排序的效率高。

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

時(shí)間復(fù)雜度為O(n^1.5),要好于直接排序的O(n ^ 2),需要注意的是增量序列的最后一個(gè)增量值必須是1.另外由于記錄跳躍式的移動(dòng),希爾排序并不是一種穩(wěn)定的排序方法。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++中的多態(tài)問(wèn)題—理解虛函數(shù)表及多態(tài)實(shí)現(xiàn)原理

    C++中的多態(tài)問(wèn)題—理解虛函數(shù)表及多態(tài)實(shí)現(xiàn)原理

    這篇文章主要介紹了C++中的多態(tài)問(wèn)題—理解虛函數(shù)表及多態(tài)實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實(shí)現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞)

    C++實(shí)現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++有限狀態(tài)機(jī)實(shí)現(xiàn)詳解

    C++有限狀態(tài)機(jī)實(shí)現(xiàn)詳解

    這篇文章主要為大家詳細(xì)介紹了C++有限狀態(tài)機(jī)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語(yǔ)言實(shí)現(xiàn)二叉樹層次遍歷介紹

    C語(yǔ)言實(shí)現(xiàn)二叉樹層次遍歷介紹

    大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)二叉樹層次遍歷介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 基于Qt編寫超精美自定義控件的示例代碼

    基于Qt編寫超精美自定義控件的示例代碼

    無(wú)論是哪一門開發(fā)框架,如果涉及到UI這塊,肯定需要用到自定義控件,本文為大家準(zhǔn)備了一些基于QT編寫的超精美自定義控件,需要的可以參考一下
    2023-07-07
  • 如何解決C語(yǔ)言,函數(shù)名與宏沖突

    如何解決C語(yǔ)言,函數(shù)名與宏沖突

    本文介紹了“如何解決C語(yǔ)言,函數(shù)名與宏沖突”,需要的朋友可以參考一下
    2013-03-03
  • C語(yǔ)言中魔性的float浮點(diǎn)數(shù)精度問(wèn)題

    C語(yǔ)言中魔性的float浮點(diǎn)數(shù)精度問(wèn)題

    這篇文章主要介紹了魔性的float浮點(diǎn)數(shù)精度問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++利用遞歸實(shí)現(xiàn)走迷宮

    C++利用遞歸實(shí)現(xiàn)走迷宮

    這篇文章主要為大家詳細(xì)介紹了C++利用遞歸實(shí)現(xiàn)走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語(yǔ)言中實(shí)現(xiàn)協(xié)程案例

    C語(yǔ)言中實(shí)現(xiàn)協(xié)程案例

    這篇文章主要介紹了C語(yǔ)言中實(shí)現(xiàn)協(xié)程案例,本文通過(guò)將協(xié)程與線程和異步回調(diào)進(jìn)行對(duì)比,以及具體實(shí)現(xiàn)案例,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C++中OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用

    詳解C++中OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用

    這篇文章主要介紹了OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

巨野县| 吉安市| 横山县| 嘉善县| 花垣县| 女性| 将乐县| 冕宁县| 姜堰市| 德庆县| 苗栗县| 即墨市| 青神县| 克拉玛依市| 霍林郭勒市| 遂宁市| 天水市| 洞口县| 宾川县| 泸州市| 金山区| 滦平县| 霍山县| 泰顺县| 巴里| 阿坝| 宝清县| 綦江县| 安远县| 玛沁县| 五河县| 嵩明县| 屏山县| 正安县| 潮州市| 思茅市| 东光县| 涡阳县| 江都市| 吉安县| 台山市|