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