冒泡排序

冒泡排序(Bubble Sort)的基本思想是:通過對排序序列從前向后(從下標較小的元素開始)依次比較相鄰元素的值,若發(fā)現(xiàn)逆序則交換,使得值比較大的元素逐漸從前向后移動,就像水底下的氣泡一樣逐漸向上冒。
假設排升序:
將數(shù)組中相鄰元素從前往后依次進行比較,如果前一個元素比后一個元素大,則交換,一趟下來后最大元素就在數(shù)組的末尾。
依次從上上述過程,直到數(shù)組中所有的元素都排列好。
依據(jù)這個思想,我們很容易寫出如下代碼:
package shujvjiegou;
//歡迎來到酸奶公園
//最好自己先思考一下,不然很快忘記的。代碼問題盡管q我3095563063知無不言
public class maopaopaixu {
? ? public static void main(String []args) {
int[] arr = {10,5,3,7,6};
System.out.println("arr的排序前:\n10? 5? 3? 7? 6");
int temp? = 0 ;
for(int i = 0 ;i< arr.length -1; i++){
for(int j = 0; j<arr.length-1-i; j++){
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("arr排序后:");
? ? ? ? for(int i = 0; i<arr.length; i++){
?
System.out.print(arr[i]+"\t");
}
? ? ??
? ? }
}
代碼實現(xiàn)過程:
?上述代碼在我們思路清晰的情況下很容易寫出,但是代碼是如何實現(xiàn)的呢?
在這里我們主要關注兩個點:趟數(shù)i和每次循環(huán)的次數(shù)j。
第1趟:i = 0時
? ? ? ? 當j = 0時,此時array[0] = 10; array[1] = 5;10 > 5,所以執(zhí)行array[j] = array[j+1]的交換代碼(這里交換代碼簡寫,下同),數(shù)組變?yōu)椋簕5,10,3,7,6};
? ? ? ? 當j = 1時,此時array[1] = 10; array[2] = 3;10 > 3,所以執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組變?yōu)閧5,3,10,7,6};
? ? ? ? 當j = 2時,此時array[2] = 10; array[3] = 7;10>7,所以執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組變?yōu)閧5,3,7,10,6};
? ? ? ? 當j = 3時,此時array[3] = 10; array[4] = 6;10>6,所以執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組變?yōu)閧5,3,7,6,10};
? ? ? ? 至此第1趟的內(nèi)部循環(huán)結(jié)束,我們將10這個數(shù)字排列到數(shù)組的末尾,此時j循環(huán)了4次,j = 3時停止。
? ? ? ? 我們發(fā)現(xiàn),數(shù)組中一共有5個元素,j循環(huán)了4次,那么第一個循環(huán)條件就是j <array.length - 1;如果不-1的話,j = 4的時候,那么array[j+1]就會越界,因為數(shù)組的下標就到4。 所以array.length - 1,是否就有一個條件呢?,答案是否定的(可以做代碼優(yōu)化),我們繼續(xù)向下執(zhí)行第2趟。
?第2趟:i = 1時
? ? ? ? 當j = 0時,此時數(shù)組是上一趟結(jié)束的數(shù)組{5,3,7,6,10},此時array[0] = 5; array[1] = 3;5 > 3,所以執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組變?yōu)椋簕3,5,7,6,10};
? ? ? ? 當j = 1時,此時array[1] = 5; array[2] = 7;5 < 7,所以不執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組還是{3,5,7,6,10};
? ? ? ? 當j = 2時,此時array[2] = 7; array[3] = 6;7 > 6,所以執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組變?yōu)閧3,5,6,7,10};
? ? ? ? 至此第2趟代碼就執(zhí)行完交換了,因為當j = 3的時候,我們比較的是7和10的大小,在第一趟的時候,我們就已經(jīng)操作完10到數(shù)組的末尾了,所以沒必要再比較一次。
? ? ? ? ?在第2趟中我們將7操作到倒數(shù)第二位的指定位置,我們發(fā)現(xiàn)內(nèi)部循環(huán)j執(zhí)行了3次,到j = 2時候停止。 其實到第2趟的時候我們已經(jīng)排序完成了,但是代碼不知道這個事情(這點記下來,可以做代碼優(yōu)化),我們接著執(zhí)行第3趟
?第3趟:i = 2時
? ? ? ? 當j = 0時,此時數(shù)組是上一趟結(jié)束的數(shù)組{3,5,6,7,10},此時array[0] = 3; array[1] = 5;3 < 5,所以不執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組還是{3,5,6,7,10}。
? ? ? ? ?當j = 1時,此時array[1] = 5; array[2] = 6;5 < 6,所以不執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組還是{3,5,6,7,10}。
? ? ? ? ?至此第3趟的內(nèi)部循環(huán)就結(jié)束了,因為如果再往下執(zhí)行,就要操作7了,但是7我們在第2趟的時候已經(jīng)操作過了。
? ? ? ? ?在第3趟的內(nèi)部循環(huán)中,是操作了6在倒數(shù)第3位的位置,我們發(fā)現(xiàn)內(nèi)部循環(huán)j執(zhí)行了2次,到j = 1時候停止。 數(shù)據(jù)早就排序好了,但是代碼不知道,所以繼續(xù)第4趟。
第4趟,i = 3時
? ? ? ? 當j = 0時,此時數(shù)組是上一趟結(jié)束的數(shù)組{3,5,6,7,10},此時array[0] = 3; array[1] = 5;3 < 5,所以不執(zhí)行array[j] = array[j+1]的交換代碼,數(shù)組還是{3,5,6,7,10}。
? ? ? ? 至此第4趟結(jié)束了,因為我們要操作的是5這個數(shù)字,和3比較完之后,就已經(jīng)在原來正確的位置了,所以循環(huán)結(jié)束。
? ? ? ? 在第4趟的內(nèi)部循環(huán)中,是操作了5在倒數(shù)第4位的位置,我們發(fā)現(xiàn)內(nèi)部循環(huán)j執(zhí)行了1次,到j = 0時候停止。
? ? ? ? ?
