日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 冒泡排序的三种写法_冒泡排序的三种实现(Java)

發布時間:2024/7/23 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。