C語(yǔ)言修煉之路悟徹?cái)?shù)組真妙理?巧用下標(biāo)破萬(wàn)敵下篇
(壹)冒泡排序
1.1冒泡排序的設(shè)計(jì)
冒泡排序(Bubble Sort)也是一種簡(jiǎn)單直觀的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢"浮"到數(shù)列的頂端。
1.2冒泡排序的步驟
- 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
- 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。
- 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
- 持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
??動(dòng)圖演示1(數(shù)據(jù)較?。?/p>
??動(dòng)圖演示2(數(shù)據(jù)較大)
1.3冒泡排序的實(shí)現(xiàn)
Tips:每一趟冒泡排序后都會(huì)減少一個(gè)需要比較的數(shù) --> 因?yàn)槊恳惶说拿芭菖判蚨紩?huì)將所比較的最大/最小值移動(dòng)到數(shù)組的最后面
(貳)數(shù)組作為函數(shù)參數(shù)
往往我們?cè)趯懘a的時(shí)候,會(huì)將數(shù)組作為參數(shù)傳個(gè)函數(shù),比如:我要實(shí)現(xiàn)一個(gè)冒泡排序(這里要講算法思想)函數(shù)將一個(gè)整形數(shù)組排序。 那我們將會(huì)這樣使用該函數(shù):
2.1冒泡排序函數(shù)的錯(cuò)誤設(shè)計(jì)
接下來(lái)看一個(gè)例子
最后結(jié)果:
并沒有預(yù)料中的達(dá)到排序的作用
在我們之前的學(xué)習(xí)中,我們知道了 數(shù)組名表示的數(shù)組首元素的地址
數(shù)組名在傳遞給函數(shù)的時(shí)候,會(huì)降級(jí)變成首元素的地址
數(shù)組名單獨(dú)放在sizeof內(nèi)部的時(shí)候 ,如:sizeof(arr),這里的arr表示整個(gè)數(shù)組而不是首元素的地址
對(duì)數(shù)組名進(jìn)行&取地址后的操作
我們知道,對(duì)指向數(shù)組元素的指針進(jìn)行自增運(yùn)算是跳過一個(gè)元素(所占字節(jié)數(shù)的地址),其實(shí)本質(zhì)是跳過一個(gè)其指針類型大小。對(duì)數(shù)組名進(jìn)行取地址后獲得的是數(shù)組的地址,如果將它和數(shù)組首元素地址以及數(shù)組名打印出來(lái),會(huì)發(fā)現(xiàn)它們的值是一樣的。但如果對(duì)&arr進(jìn)行+1等操作,就會(huì)發(fā)現(xiàn)跳過的不是一個(gè)元素的大小,而是一個(gè)數(shù)組的大小。
2.2冒泡排序函數(shù)的正確設(shè)計(jì)
當(dāng)數(shù)組傳參的時(shí)候,實(shí)際上只是把數(shù)組的首元素的地址傳遞過去了。所以即使在函數(shù)參數(shù)部分寫成數(shù)組的形式:int arr[]表示的依然是一個(gè)指針:int *arr。那么,函數(shù)內(nèi)部的sizeof(arr)結(jié)果是4。
(叁)對(duì)數(shù)組名的拓展解析
數(shù)組名就是首元素的地址,但是有兩個(gè)例外
- sizeof(數(shù)組名),這里的數(shù)組名表示整個(gè)數(shù)組,sizeof(數(shù)組名)表示的是整個(gè)數(shù)組的大小
- &數(shù)組名,這里的數(shù)組名表示的是整個(gè)數(shù)組,取出的是整個(gè)數(shù)組的地址
&arr取出的是整個(gè)數(shù)組的地址,所以 arr + 1后跳過了整個(gè)數(shù)組的大小為
4 * 10 = 40 個(gè)字節(jié)的地址大小
C游記之旅至此,大家也掌握了一定的技能,推薦大家可以跟著下面這篇文章,去實(shí)現(xiàn)一個(gè)屬于自己的三子棋游戲哦
到此這篇關(guān)于C語(yǔ)言修煉之路悟徹?cái)?shù)組真妙理 巧用下標(biāo)破萬(wàn)敵下篇的文章就介紹到這了,更多相關(guān)C語(yǔ)言 數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言中的柔性數(shù)組你真的了解嗎
- C語(yǔ)言雙指針多方法旋轉(zhuǎn)數(shù)組解題LeetCode
- 賭你會(huì)懵的C語(yǔ)言指針進(jìn)階數(shù)組場(chǎng)景解析
- C語(yǔ)言數(shù)組全面總結(jié)梳理
- C語(yǔ)言?指針數(shù)組進(jìn)階詳解
- C語(yǔ)言數(shù)組和指針,內(nèi)存之間的關(guān)系
- c語(yǔ)言循環(huán)加數(shù)組實(shí)現(xiàn)漢諾塔問題
- 從頭學(xué)習(xí)C語(yǔ)言之二維數(shù)組
- C語(yǔ)言修煉之路悟徹?cái)?shù)組真妙理?巧用下標(biāo)破萬(wàn)敵上篇
相關(guān)文章
總結(jié)UNIX/LINUX下C++程序計(jì)時(shí)的方法
本文總結(jié)了下UNIX/LINUX下C++程序計(jì)時(shí)的一些函數(shù)和方法,對(duì)日常使用C++程序的朋友很有幫助,有需要的小伙伴們可以參考學(xué)習(xí),下面一起來(lái)看看吧。2016-08-08C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之單鏈表
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。本文將為大家介紹C語(yǔ)言中單鏈表的基本概念與讀取數(shù)據(jù)元素,需要的可以參考一下2021-12-12C++中的vector使用詳解及重要部分底層實(shí)現(xiàn)
本篇文章會(huì)對(duì)vector的語(yǔ)法使用進(jìn)行詳解,同時(shí),還會(huì)對(duì)重要難點(diǎn)部分的底層實(shí)現(xiàn)進(jìn)行講解,其中有vector的迭代器失效和深拷貝問題,希望本篇文章的內(nèi)容會(huì)對(duì)你有所幫助2023-07-07C++ OpenCV實(shí)戰(zhàn)之圖像透視矯正
這篇文章主要介紹了通過C++ OpenCV實(shí)現(xiàn)圖像的透視矯正,文中的示例代碼講解詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01完美解決QT?QGraphicsView提升到QChartView報(bào)錯(cuò)的問題
使用QT提供的QChartView來(lái)繪制圖表,提升QGraphicsView控件繼承QChartView后,然后將QGraphicsView提升到我們自己寫的類,怎么才能確保提升后編譯不報(bào)錯(cuò)呢,下面小編給大家?guī)?lái)了QT QGraphicsView 提升到QChartView報(bào)錯(cuò)解決方案,感興趣的朋友一起看看吧2023-05-05C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)總結(jié)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07