解析氣泡排序和闡述兩種不同氣泡排序的區別
今天在學習Javascript的時候有個demo用的是氣泡排序,仔細一看卻覺得有的地方不太對。這好像和我用Java寫的氣泡排序不太一樣啊,看似相同的程式,輸出的結果卻相反。
於是花了點時間仔細研究了下,並複習了氣泡排序的思路,在這裡用java 和大家分享下
/** * */ package Sort; /** * @author fanjialiang2401 2017年9月18日 */ public class Test { public static void main(String[] args) { int []s= {23,34,52,1,5}; for (int i = 0; i < s.length; i++) { for (int j =0; j < s.length; j++) { if (s[i]>s[j]) { int temp=0; temp=s[i]; s[i]=s[j]; s[j]=temp; } } for (int j2 = 0; j2 < s.length; j2++) { System.out.print(s[j2]+" "); } System.out.println(); } } }
這是用Java寫的第一種氣泡排序的過程和結果,可以看出思路還是很清晰的:
總共有兩層迴圈,外層迴圈i從0開始,內層迴圈從i開始;從第一個數開始一次和後面的數進行比較,如果比後面的數大,就進行相互交換。一次遍歷結束,最小的數會出現在最左邊。然後從第二個數再開始,把第二小的數再找出來放在最左邊。當外層迴圈結束,排序也就停止了。
按照上圖的思路:
先是從1開始 這時候i=0,遍歷了一遍沒有比他更小的了,陣列保持不變。
再從34開始 i=1,23比它小,和23交換,這時候陣列變成了 1,23,52,34,5。需要注意的是:這時候的s[i]變 成了23,不再是34了。而且遍歷仍在進行,23再和5進行比較。23>5
接下來再從i=2開始,也就是23。23和本身比較,不變,再和34比較,不變,再和52比較,還是不變。遍歷完成
接下來是34(i=3)。先和自身比較,不變,再和52比較,不變。遍歷完成。
最後是52(i=4),和自身比較,不變。遍歷全部結束,這樣就排好序了。
接下來說說我今天下午遇到的另一種氣泡排序,大家乍眼一看是不是覺得演算法和上圖的內容是一模一樣呢?結果卻是截然相反。上面是從小到大排序,底下輸出的結果是從大到小。只因為我改了一個字。把內層j的初始值改成了0。這樣的一點微小的改變卻影響了整個執行過程。下面我們來分析一下:
比較的思路還是一樣的:s[i]和s[j]進行比較,如果s[i]比s[j]大,進行相互交換。
i=0時:s[i]小於其他任何數,不變
i=1時:s[i]和s[j]比較。注意:這時候的j=0;也就是s[i]要先和s[0]也就是1進行比較。34>1,交換 陣列變成了:34,1,52,23,5這時候s[i]變成了1,1繼續和其他數進行比較,不變
i=2時:s[2]也就是52開始比較,先和s[0]比較。52>34,交換。陣列變成了 52,1,34,23,5。這時候s[2]變成了 34,34再和s[1]比較。34>1,交換。陣列變成了:52,34,1,23,5。這時候再由1進行遍歷,1小於任何數,遍 歷完沒有變化,陣列變成了52,34,1,23,5
i=3時,s[i]為23。23進行遍歷,23<52,23<34,不變。23>1,交換。陣列變成了52,34,23,1,5再由1進行比較,不變。
i=4時。s[i]=5,5<前面的任何數除過1。進行交換,遍歷全部完成。陣列變成了52,34,23,5,1 即為最後結果
兩種方法只差了一個數字。結果卻截然相反。這就是程式的魅力。任何細小的差錯都會導致可能截然相反的結果。正所謂:失之毫釐,謬以千里。
PS:因為自己經常在看一些演算法時,覺得別人如果寫的很詳細理解起來就很容易。有些寫的很模糊,甚至都不會想去看。所以自己在寫的時候也是儘量的越詳細越好。