冒泡排序演算法的原理如下:1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個,否則不交換2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。做完這一步,最後的元素應該會是最大的數。3.針對所有的元素重覆以上的步驟,除了最後一個。4.持續每次對越來越少的元素重覆上面的步驟,直到沒有任何 ...
冒泡排序演算法的原理如下:
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個,否則不交換
2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。做完這一步,最後的元素應該會是最大的數。
3.針對所有的元素重覆以上的步驟,除了最後一個。
4.持續每次對越來越少的元素重覆上面的步驟,直到沒有任何一對數字需要比較。
例如:給定int[] arr={13,46,22,65,3},定義一個方法將數組冒泡排序,並列印
分析過程
第一輪比較: 裡面比較了四次 i=0時;j=0,1,2,3,(即j=0;j<4;j++)
{13,46,22,65,3} 13<46 不交換 arr[0]與arr[1]--->j=0:arr[j]與arr[j+1]比較
{13,46,22,65,3} 46>22 交換 arr[1]與arr[2]--->j=1:arr[j]與arr[j+1]比較
{13,22,46,65,3} 46<65 不交換 arr[2]與arr[3]--->j=2:arr[j]與arr[j+1]比較
{13,22,46,65,3} 65>3 交換 arr[3]與arr[4]--->j=3:arr[j]與arr[j+1]比較
最終排序{13,22,46,3,65}得出第一個最大數65
第二輪比較:裡面比較了三次 i=1時;j=0,1,2,(即j=0;j<3;j++)
{13,22,46,3} 13<22 不交換 arr[0]與arr[1]--->j=0:arr[j]與arr[j+1]比較
{13,22,46,3} 22<46 不交換 arr[1]與arr[2]--->j=1:arr[j]與arr[j+1]比較
{13,22,46,3} 46>3 交換 arr[2]與arr[3]--->j=2:arr[j]與arr[j+1]比較
最終排序{13,22,3,46}得出次大數46
第三輪比較:裡面比較了兩次 i=2時;j=0,1,(即j=0;j<2;j++)
{13,22,3} 13<22 不交換 arr[0]與arr[1]--->j=0:arr[j]與arr[j+1]比較
{13,22,3} 22>3 交換 arr[1]與arr[2]--->j=1:arr[j]與arr[j+1]比較
最終排序{13,3,22}得出第三個大的元素是22
第四輪比較:裡面比較了一次 i=3時;j=0,(即j=0;j<1;j++)
{13,3} 13>3 交換 arr[0]與arr[1]----->j=0:arr[j]與arr[j+1]比較
最終排序{13,3,22}得出第四個大的元素是13
如果用i表示比較輪數,用j表示每輪裡面比較的次數,肯定要用到嵌套迴圈
arr.length=5
i=0時;j=0,1,2,3,(即j=0;j<4;j++) 0+4=arr.length-1
i=1時;j=0,1,2, (即j=0;j<3;j++) 1+3=arr.length-1
i=2時;j=0,1, (即j=0;j<2;j++) 2+2=arr.length-1 得出?=arr.length-1-i
i=3時;j=0, (即j=0;j<1;j++) 3+1=arr.length-1
可以看出外層i=0;i<arr.length-1;i++,而裡層j=0;j<?;j++,?=4,3,2,1不斷遞減,可以看出外層i
在遞增時,裡層j<?而?在遞減,最終得出得出?=arr.length-1-i,最終結果是
i=0;i<arr.length-1;i++, j=0;j<arr.length-1-i;j++,
代碼實現如下:
public class Demo4 {
public static void main(String[] args){
//1.定義一個數組
int[] arr={13,46,22,65,3};
//2.調用bubbleSort方法
bubbleSort(arr);
//3.列印排序完的數組,即數組遍歷
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
//2.定義一個方法用冒泡排序將數組從小到大排序
//參數:整個方法裡面唯一可變的量就是數組,對數組排序,數組是外部給的,可變的
//返回值:最終結果是將整個數組重新排序,不需要求值,所以沒有返回值
public static void bubbleSort(int[] arr){
for(int i=0; i<arr.length; i++){//控制比較的輪數,即數組長度-1,所以i<arr.length
for(int j=0; j<arr.length-1-i; j++){//控制每輪裡面比較的次數
if(arr[j]>arr[j+1]){//如果第一個比第二個大,就交換他們兩個
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
}