學以致用之氣泡排序

2021-07-10 17:06:55 字數 1218 閱讀 7093

氣泡排序是一種看起來很簡單的交換排序,尤其是其易記的特點,促使很多初學者只是簡單地記住氣泡排序的某種**實現,而忽略了對其更深層次的理解,本文旨在通過對氣泡排序的解析來幫助初學者真正理解氣泡排序的**實現原理,如果你能在閱讀完本文後不參考任何**隨手實現一種氣泡排序,那麼這篇文章的目的便達到了。

下面是兩段不同的氣泡排序實現**,如下:

public

void

bubblesort(int arrs)}}

}

public

void

bubblesort(int arrs)}}

}

在繼續往下閱讀之前,請先暫緩幾分鐘,有必要先確保自己是否真的在思考兩段**的不同之處,而不是把注意力停留在**的表象上。

顯然上面兩段**都比較容易讀懂,但是我們的追求不再是停留在「讀」這個層次,而是應該具備去「寫」任何一種可能的氣泡排序實現乃至一種與氣泡排序類似但是從未見過的演算法的實現**,那時死記硬背這種方式顯然不會幫助我們太多。

好吧,現在你應該已經意識到理解演算法**實現原理的重要性,接下來正式進入我們的主題。

通過閱讀上面兩段氣泡排序的實現**,不難發現兩段**中都有類似的for迴圈巢狀以及都要進行元素的交換這一過程,那麼是不是意味著氣泡排序的實現必須要依賴for迴圈和適當的時候交換陣列中的相鄰元素呢,這個問題不難回答,作為一種交換排序,交換是永遠無法迴避的問題,但是for迴圈卻並不是迴圈中唯一的選擇,重點不在於選擇了何種迴圈,而在於選擇了迴圈,我們試圖去看清氣泡排序的實現中真正必要的那些東西,而不是**中展現在我們面前的那些表象。

現在回想一下氣泡排序的思想,事實上氣泡排序一直在做著相同的事情,總是試圖把剩下的元素中最大或最小的那個元素移動到陣列元素遍歷方向所指向的那一端,但又不得不做些什麼去保障之前的勞動成果不會被自己破壞。

上面的氣泡排序的思想中有兩處需要重點關注的地方:

請仔細思考這兩個問題,可能讀到這裡你已經有種豁然開朗的感覺,那麼你可以選擇不再繼續往下閱讀,去實踐一下自己剛剛注意到的一些東西也是乙個很好的選擇。

對於第乙個問題,答案就在下面兩段**的不同之處:

if(arrs[j]>arrs[j+1])
if(arrs[j]1])
對於第二個問題,答案也很簡單,其實正是外層for迴圈和內層for迴圈的迴圈條件協作的功勞,這也正是外層for迴圈唯一的職責。

未完待續。

C 學以致用(2)

如果第乙個運算物件是負數,那麼求模結果為負數 如果第乙個運算物件是正數,那麼求模結果也是正數。printf d d n 11 5,11 5 printf d d n 11 5,11 5 printf d d n 11 5,11 5 printf d d n 11 5,11 5 程式執行結果 2 1 ...

Matlab學以致用 曲線擬合

使用matlab自帶的polyfit函式,可以很方便地根據現有樣本資料進行多項式曲線擬合,為了有直觀感受,先上例程,如下所示 1 x 5 0.1 5 樣本資料x座標 2 y 3 x.2 6 x 5 randn size x 樣本資料y座標,新增隨機雜訊 34 p polyfit x,y,2 使用自帶...

思想一 實事求是 學以致用

實事求是 學以致用 何謂實事求是?實事 就是客觀存在的一切事物,是 就是客觀事物的內部聯絡,即規律性,求 就是我們去研究。毛選 801頁 如何做到實事求是呢?調查的態度要實事求是 寫文章的方法要實事求是 研究問題要實事求是 學以致用體現實事求是。一 調查的態度要實事求是。毛在第三卷的開篇 農村調查 ...