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

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

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

手撕排序算法系列之:冒泡排序。

從本篇文章開始,我會介紹并分析常見的幾種排序,大致包括插入排序,冒泡排序,希爾排序,選擇排序,堆排序,快速排序,歸并排序等。

大家可以點(diǎn)擊此鏈接閱讀其他排序算法:排序算法_大合集(data-structure_Sort)

本篇主要來手撕冒泡排序~~?

目錄

1.常見的排序算法

1.1交換排序

2.冒泡排序的實現(xiàn)

2.1基本思想

2.2單趟冒泡排序

2.2.1思路分析

2.2.2單趟代碼實現(xiàn)

3.冒泡排序代碼實現(xiàn)

4.冒泡排序測試

5.冒泡排序的時間復(fù)雜度

5.1最壞情況?

5.2最好情況

6.冒泡排序的優(yōu)化寫法?

6.1優(yōu)化思想

6.2優(yōu)化代碼?

6.3優(yōu)化算法的時間復(fù)雜度

6.3.1 最壞情況

6.3.2 最好情況

7.冒泡排序的特性總結(jié)

1.常見的排序算法

1.1交換排序

冒泡排序?qū)儆谝环N交換排序,因此我們在了解冒泡排序之前,先了解一下交換排序的基本思想。

基本思想:所謂交換,就是根據(jù)序列中兩個記錄鍵值的比較結(jié)果來對換這兩個記錄在序列中的位置。
交換排序的特點(diǎn)是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。

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

2.冒泡排序的實現(xiàn)

2.1基本思想

?直接插入排序是一種簡單的交換排序法,其基本思想是:

用兩個變量指定2個數(shù),如果前一個數(shù)比后一個數(shù)字大就交換(升序)。

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

2.2單趟冒泡排序

2.2.1思路分析

單趟下來冒泡排序就會把最大的數(shù)字放在最后一位(升序)。

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

2.2.2單趟代碼實現(xiàn)

void Swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}
//單趟
for (int i = 1; i < n ; ++i)
{
	if (a[i - 1] > a[i])
		{
		Swap(&a[i - 1], &a[i]);
		}
}

3.冒泡排序代碼實現(xiàn)

在單趟的基礎(chǔ)之上,加上一個循環(huán),將單趟套進(jìn)去即可。需要注意的是,每次循環(huán)冒出一個數(shù)字,因此單趟循環(huán)之后到下一次循環(huán)中比較次數(shù)就要減一,這里我們使用變量來控制即可

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; ++j)
	{
		//單趟
		for (int i = 1; i < n - j; ++i)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
			}
		}
	}
}

4.冒泡排序測試

void Swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}
//冒泡排序 時間復(fù)雜度:O(N^2)
void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; ++j)
	{
		//單趟
		for (int i = 1; i < n - j; ++i)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
			}
		}
	}
}
int main()
{
	//冒泡排序
	TestBubbleSort();
	return 0;
}

測試結(jié)果:

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

5.冒泡排序的時間復(fù)雜度

5.1最壞情況?

最壞情況:逆序排順序。假設(shè)有n個數(shù),等差數(shù)列1+2+3+4+...+n

因此最壞的時間復(fù)雜度為O(n^2)。

5.2最好情況

最好情況:有序排有序。對于冒泡排序來說,即使是有序仍然會把每個數(shù)進(jìn)行冒泡。雖然有序,但是冒泡排序不知道呀,仍然按著老套路一個一個比較冒。

因此最好的時間復(fù)雜度仍為O(n^2)。

6.冒泡排序的優(yōu)化寫法?

在時間復(fù)雜度分析的過程中,我們可以發(fā)現(xiàn),如果序列已經(jīng)有序了,時間復(fù)雜度仍然是O(n^2).因此我們可以對這種情況進(jìn)行優(yōu)化。

6.1優(yōu)化思想

我們定義一個變量,在冒泡的過程中,如果有兩個數(shù)字進(jìn)行交換,說明原序列不是有序的,但是如果冒一遍發(fā)現(xiàn),沒有數(shù)字記性交換,說明該序列是有序的,就沒必要繼續(xù)冒下去了。因此,我們可以定義一個exchange變量,其實賦值為0,如果冒一遍有交換,就讓exchange = 1,如果沒有交換,不改變exchange的值,我們最后只需要判斷exchange的值即可的值序列是否有序。

6.2優(yōu)化代碼?

void Swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

//冒泡排序 時間復(fù)雜度:O(N^2)
//優(yōu)化:如果前幾個已經(jīng)有序,比較一遍之后后續(xù)的無序再進(jìn)行比較 直接往后走
//實現(xiàn):定義一個exchange變量,初始化為0;如果交換就說明變化,將exchange變1.
//沒變的話就說明有序,就不用往下走 直接break;

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; ++j)
	{
		int exchange = 0;
		//單趟
		for (int i = 1; i < n - j; ++i)
		{
			if (a[i - 1] > a[i])
			{
				exchange = 1;
				Swap(&a[i - 1], &a[i]);
			}
		}

		if (exchange == 0)
			break;
	}
}

int main()
{
	//冒泡排序
	TestBubbleSort();
	return 0;
}

6.3優(yōu)化算法的時間復(fù)雜度

6.3.1 最壞情況

最壞情況仍是逆序排順序 時間復(fù)雜度O(n^2)

6.3.2 最好情況

最好情況是本身就有序,我們在第一遍冒泡過程過,exchange沒有改變,我們就break了。

因此此時的時間復(fù)雜度是O(n)。

7.冒泡排序的特性總結(jié)

冒泡排序的特性總結(jié):
1. 冒泡排序是一種非常容易理解的排序
2. 時間復(fù)雜度: O(N^2)
3. 空間復(fù)雜度: O(1)
4. 穩(wěn)定性:穩(wěn)定

(本篇完)?文章來源地址http://www.zghlxwxcb.cn/news/detail-501879.html

到了這里,關(guān)于[ 數(shù)據(jù)結(jié)構(gòu) -- 手撕排序算法第二篇 ] 冒泡排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

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

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

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

    2024年02月16日
    瀏覽(37)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法篇】手撕八大排序算法之快排的非遞歸實現(xiàn)及遞歸版本優(yōu)化(三路劃分)

    【數(shù)據(jù)結(jié)構(gòu)與算法篇】手撕八大排序算法之快排的非遞歸實現(xiàn)及遞歸版本優(yōu)化(三路劃分)

    ???內(nèi)容專欄: 《數(shù)據(jù)結(jié)構(gòu)與算法篇》 ??本文概括: 利用數(shù)據(jù)結(jié)構(gòu)棧(Stack)來模擬遞歸,實現(xiàn)快排的非遞歸版本;遞歸版本測試OJ題時,有大量重復(fù)元素樣例不能通過,導(dǎo)致性能下降,優(yōu)化快速排序通過將數(shù)組劃分為三個區(qū)域,可以更有效地處理重復(fù)元素。 ??本文作者:

    2024年02月11日
    瀏覽(83)
  • Mysql第二篇---InnoDB數(shù)據(jù)存儲結(jié)構(gòu)

    Mysql第二篇---InnoDB數(shù)據(jù)存儲結(jié)構(gòu)

    索引結(jié)構(gòu)給我們提供了高效的索引方式, 不過索引信息以及數(shù)據(jù)記錄都是保存在文件上的(innodb的ibd文件, MyISAM的MyI和MyD文件), 確切的說是存儲在頁結(jié)構(gòu)中. 另一方面, 索引是在 存儲引擎 中實現(xiàn)的, MySQL服務(wù)器上的存儲引擎負(fù)責(zé)對表中數(shù)據(jù)的讀取和寫入工作. 不同存儲引擎中存放

    2024年02月07日
    瀏覽(94)
  • [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序算法第六篇] 遞歸實現(xiàn)快速排序(集霍爾版本,挖坑法,前后指針法為一篇的實現(xiàn)方法,很能打)

    [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序算法第六篇] 遞歸實現(xiàn)快速排序(集霍爾版本,挖坑法,前后指針法為一篇的實現(xiàn)方法,很能打)

    目錄 1、常見的排序算法 1.1 交換排序基本思想 2、快速排序的實現(xiàn)方法 2.1 基本思想 3 hoare(霍爾)版本 3.1 實現(xiàn)思路 3.2 思路圖解 3.3 為什么實現(xiàn)思路的步驟2、3不能交換 3.4 hoare版本代碼實現(xiàn) 3.5 hoare版本代碼測試 4、挖坑法 4.1 實現(xiàn)思路 4.2 思路圖解 4.3 挖坑法代碼實現(xiàn) 4.4 挖坑

    2024年02月16日
    瀏覽(33)
  • 數(shù)據(jù)結(jié)構(gòu)修煉第二篇:順序表和鏈表

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

    第一章 時間復(fù)雜度和空間復(fù)雜度 第二章 順序表,列表 第三章 棧和隊列 第四章 二叉樹 第五章 排序 作者:??樂言?? 簡介:??大一學(xué)生,目前在致力于c/c++/python,高數(shù)的學(xué)習(xí),有問題盡管問我,關(guān)注后私聊! 持續(xù)更新專欄:《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)】手撕排序

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

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

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

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

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

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

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

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

    [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第一篇] 插入排序

    目錄 1、常見的排序算法 2、插入排序的思路 2.1 基本思想 2.2 直接插入排序 2.2.1 單趟排序的思路 2.2.2 單趟排序代碼實現(xiàn) 3、插入排序代碼 4、插入排序+打印測試 5、插入排序的時間復(fù)雜度 5.1 最壞情況 5.2 最好情況 6、直接插入排序的特性總結(jié) ? 直接插入排序是一種簡單的插入

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

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

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

    2024年02月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包