C語言修煉之路悟徹數組真妙理 巧用下標破萬敵下篇
(壹) 冒泡排序
1.1 冒泡排序的設計
冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢”浮”到數列的頂端。
1.2 冒泡排序的步驟
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
- 針對所有的元素重復以上的步驟,除瞭最後一個。
- 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
📺動圖演示1(數據較小)
📺動圖演示2(數據較大)
1.3 冒泡排序的實現
Tips:每一趟冒泡排序後都會減少一個需要比較的數 –> 因為每一趟的冒泡排序都會將所比較的最大/最小值移動到數組的最後面
(貳) 數組作為函數參數
往往我們在寫代碼的時候,會將數組作為參數傳個函數,比如:我要實現一個冒泡排序(這裡要講算法思想)函數將一個整形數組排序。 那我們將會這樣使用該函數:
2.1 冒泡排序函數的錯誤設計
接下來看一個例子
最後結果:
並沒有預料中的達到排序的作用
在我們之前的學習中,我們知道瞭 數組名表示的數組首元素的地址
數組名在傳遞給函數的時候,會降級變成首元素的地址
數組名單獨放在sizeof內部的時候 ,如:sizeof(arr),這裡的arr表示整個數組而不是首元素的地址
對數組名進行&取地址後的操作
我們知道,對指向數組元素的指針進行自增運算是跳過一個元素(所占字節數的地址),其實本質是跳過一個其指針類型大小。對數組名進行取地址後獲得的是數組的地址,如果將它和數組首元素地址以及數組名打印出來,會發現它們的值是一樣的。但如果對&arr進行+1等操作,就會發現跳過的不是一個元素的大小,而是一個數組的大小。
2.2 冒泡排序函數的正確設計
當數組傳參的時候,實際上隻是把數組的首元素的地址傳遞過去瞭。所以即使在函數參數部分寫成數組的形式:int arr[]表示的依然是一個指針:int *arr。那麼,函數內部的sizeof(arr)結果是4。
(叁) 對數組名的拓展解析
數組名就是首元素的地址,但是有兩個例外
- sizeof(數組名),這裡的數組名表示整個數組,sizeof(數組名)表示的是整個數組的大小
- &數組名,這裡的數組名表示的是整個數組,取出的是整個數組的地址
&arr取出的是整個數組的地址,所以 arr + 1後跳過瞭整個數組的大小為
4 * 10 = 40 個字節的地址大小
C遊記之旅至此,大傢也掌握瞭一定的技能,推薦大傢可以跟著下面這篇文章,去實現一個屬於自己的三子棋遊戲哦
【入門級C語言小遊戲】——“三子棋”
到此這篇關於C語言修煉之路悟徹數組真妙理 巧用下標破萬敵下篇的文章就介紹到這瞭,更多相關C語言 數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!