冒泡排序
Java中有很多種排序:冒泡排序窘问、快速排序、選擇排序宜咒、插入排序惠赫、希爾排序,甚至還有基數(shù)排序故黑、雞尾酒排序儿咱、桶排序、鴿巢排序场晶、歸并排序等混埠。本文給大家介紹的是冒泡排序。
1诗轻、在冒泡排序中钳宪,對數(shù)組中相鄰位置的元素進(jìn)行兩兩比較,較小的數(shù)或者較大的數(shù)向后移扳炬,本文采用的是較大的數(shù)向后移吏颖。以下是冒泡排序的例子。
//冒泡排序
int[] arr1 = {5, 3, 2, 6, 1};
for (int i = 0; i <arr1.length -1 ; i++) {
for (int j = 0; j <arr1.length - 1 - i ; j++) {
if (arr1[j] > arr1[j + 1]) {
int temp = arr1[j];
arr1[j] = arr1[j + 1];
arr1[j + 1] = temp;
}
}
}
for (int i = 0; i <arr1.length ; i++) {
System.out.println(arr1[i]);
}
以下是排序執(zhí)行過程中各數(shù)字位置的變化
第一次: 3 5 2 6 1
3 2 5 6 1
3 2 5 6 1
3 2 5 1 6
第二次: 2 3 5 1 6
2 3 5 1 6
2 3 1 5 6
第三次: 2 3 1 5 6
2 1 3 5 6
第四次: 1 2 3 5 6
在上面的例子中恨樟,我們定義了一個(gè)數(shù)組半醉,對數(shù)組進(jìn)行排序,然后按照從小到大的順序輸出數(shù)組厌杜。
我們可以看到奉呛,冒泡排序主要是由for循環(huán)嵌套以及if語句組成,for循環(huán)是根據(jù)判斷條件內(nèi)容來檢查是否要繼續(xù)執(zhí)行循環(huán)夯尽,而判斷條件是冒泡排序最核心的部分瞧壮。
以下是關(guān)于if中代碼的解釋:
將數(shù)組中相鄰的兩個(gè)元素經(jīng)濟(jì)比較,較大的數(shù)向后移匙握。
下面來解釋以下兩個(gè)for循環(huán)中判斷條件的書寫依據(jù):
一咆槽、在第一個(gè)for循環(huán)中,i的限定條件為arr1.length-1圈纺,即數(shù)組的長度減一秦忿,這個(gè)條件是用來限定第二個(gè)循環(huán)執(zhí)行的次數(shù),從上面的數(shù)字順序變化的結(jié)果中可以看出:在第一次內(nèi)循環(huán)執(zhí)行的過程中蛾娶,找到了最大的那個(gè)數(shù)灯谣,依次類推,當(dāng)?shù)谒拇蔚臅r(shí)候蛔琅,找到了第四大的數(shù)胎许,同時(shí)也找到了最小的數(shù),它一次性的找到了兩個(gè)位置的數(shù),就不需要第五次循環(huán)了辜窑,所以第一個(gè)for循環(huán)的限定條件為數(shù)組長度減一钩述。
二、在第二個(gè)for循環(huán)中穆碎,arr1[3]和arr1[4]比較是第一次循環(huán)中的最后一次比較牙勘,在此次比較中會(huì)找到最大的數(shù),在以后的比較中所禀,最后一位就不需要再進(jìn)行比較了方面,所以第二次循環(huán)中進(jìn)行比較的數(shù)字只有四個(gè),依次類推北秽,每次比較的數(shù)都會(huì)少一個(gè)葡幸,即 j 最大值也依次遞減,而是遞增贺氓,所以是arr1.length-i蔚叨,因?yàn)樵谙旅娴膇f判斷中有arr1[j + 1]的存在,所以判定條件要再減一辙培,否則會(huì)出現(xiàn)Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException蔑水,即數(shù)組越界的錯(cuò)誤。