java 冒泡排序的三种写法_冒泡排序的三种实现(Java)
冒泡排序是非常好理解的,以從小到大排序為例,每一輪排序就找出未排序序列中最大值放在最后。
設數組的長度為N:
(1)比較前后相鄰的二個數據,如果前面數據大于后面的數據,就將這二個數據交換。
(2)這樣對數組的第0個數據到N-1個數據進行一次遍歷后,最大的一個數據就“沉”到數組第N-1個位置。
(3)N=N-1,如果N不為0就重復前面二步,否則排序完成。
以上就是冒泡排序的基本思想,按照這個定義很快就能寫出代碼:
/**
* 冒泡排序的第一種實現, 沒有任何優化
*@param a
*@param n
*/
public static void bubbleSort1(int [] a, int n){
int i, j;
for(i=0; i
for(j=1; j
if(a[j-1] > a[j]){//前面的數字大于后面的數字就交換
//交換a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
}
}
}
}// end
給出一個測試代碼:
public static void main(String[] args) {
int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
BubbleSort.bubbleSort1(arr, arr.length);
for(int i:arr){
System.out.print(i+",");
}
}
運行結果:
0,1,1,2,3,3,4,7,8,9,12,22,65,
下面開始考慮優化,如果對于一個本身有序的序列,或則序列后面一大部分都是有序的序列,上面的算法就會浪費很多的時間開銷,這里設置一個標志flag,如果這一趟發生了交換,則為true,否則為false。明顯如果有一趟沒有發生交換,說明排序已經完成。
/**
* 設置一個標志,如果這一趟發生了交換,則為true,否則為false。明顯如果有一趟沒有發生交換,說明排序已經完成。
*@param a
*@param n
*/
public static void bubbleSort2(int [] a, int n){
int j, k = n;
boolean flag = true;//發生了交換就為true, 沒發生就為false,第一次判斷時必須標志位true。
while (flag){
flag=false;//每次開始排序前,都設置flag為未排序過
for(j=1; j
if(a[j-1] > a[j]){//前面的數字大于后面的數字就交換
//交換a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交換過數據;
flag = true;
}
}
k--;//減小一次排序的尾邊界
}//end while
}//end
運行測試main函數結果:
0,1,1,2,3,3,4,7,8,9,12,22,65,
再進一步做優化。比如,現在有一個包含1000個數的數組,僅前面100個無序,后面900個都已排好序且都大于前面100個數字,那么在第一趟遍歷后,最后發生交換的位置必定小于100,且這個位置之后的數據必定已經有序了,也就是這個位置以后的數據不需要再排序了,于是記錄下這位置,第二次只要從數組頭部遍歷到這個位置就可以了。如果是對于上面的冒泡排序算法2來說,雖然也只排序100次,但是前面的100次排序每次都要對后面的900個數據進行比較,而對于現在的排序算法3,只需要有一次比較后面的900個數據,之后就會設置尾邊界,保證后面的900個數據不再被排序。
public static void bubbleSort3(int [] a, int n){
int j , k;
int flag = n ;//flag來記錄最后交換的位置,也就是排序的尾邊界
while (flag > 0){//排序未結束標志
k = flag; //k 來記錄遍歷的尾邊界
flag = 0;
for(j=1; j
if(a[j-1] > a[j]){//前面的數字大于后面的數字就交換
//交換a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交換過數據;
flag = j;//記錄最新的尾邊界.
}
}
}
}
這種方法是我看到的最優化的冒泡排序了。
運行測試例子結果:
0,1,1,2,3,3,4,7,8,9,12,22,65,
1
可知運行結果正確。
總結
以上是生活随笔為你收集整理的java 冒泡排序的三种写法_冒泡排序的三种实现(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php send helo/ehlo f
- 下一篇: java美元兑换,(Java实现) 美元