1. 程式人生 > >解析氣泡排序和闡述兩種不同氣泡排序的區別

解析氣泡排序和闡述兩種不同氣泡排序的區別

      今天在學習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

它倆交換。這時候陣列變成了上圖的第二             行:1,5, 23, 52, 34。

      接下來再從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:因為自己經常在看一些演算法時,覺得別人如果寫的很詳細理解起來就很容易。有些寫的很模糊,甚至都不會想去看。所以自己在寫的時候也是儘量的越詳細越好。