java利用冒泡排序對數組進行排序_java

來源:互聯網
上載者:User

本文執行個體講述了java利用冒泡排序對數組進行排序的方法。分享給大家供大家參考。具體如下:

一、冒泡排序:

利用冒泡排序對數組進行排序

二、基本概念:

依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。

三、實現思路:

用二重迴圈實現,外迴圈變數設為i,內迴圈變數設為j。假如有n個數需要進行排序,則外迴圈重複n-1次,內迴圈依次重複n-1,n-2,...,1次。每次進行比較的兩個元素都是與內迴圈j有關的,它們可以分別用a[j]和a[j+1]標識,i的值依次為1,2,...,n-1,對於每一個i,j的值依次為0,1,2,...n-i 。

設數組長度為N:
1.比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。
2.這樣對數組的第0個資料到N-1個資料進行一次遍曆後,最大的一個資料就“沉”到數組第N-1個位置。
3.N=N-1,如果N不為0就重複前面二步,否則排序完成。

四、java代碼實現:

package ArrayDemo; /**  * @author pplsunny  * @category .21  */ public class ArrayDemo {     /**    * 用增強for迴圈輸出排序結果    */   public static void main(String[] args) {    int[] a = { 2, 4, 76, 12, 34, 23, 86 };    ArrayDemo.bubbleSort(a);    for (int b : a) {     System.out.print(b + " ");    }   }   /*    * 冒泡排序函數,定義為靜態方便使用, * 也是開發中定義工具類的一個方法    */   public static void bubbleSort(int a[]) {    for (int i = 1; i < a.length; i++) {   //這是控制趟數     for (int j = 0; j < a.length - i; j++) {    //j < a.length - i,比較元素的個數      if (a[j] > a[j + 1]) {       int temp = a[j];       a[j] = a[j + 1];       a[j + 1] = temp;      }     }    }   } } 

五、效能分析:

若記錄序列的初始狀態為"正序",則冒泡排序過程只需進行一趟排序,在排序過程中只需進行n-1次比較,且不移動記錄;反之,若記錄序列的初始狀態為"逆序",則需進行n(n-1)/2次比較和記錄移動。因此冒泡排序總的時間複雜度為O(n*n)。

六、演算法最佳化:

冒泡排序法存在的不足及改進方法:
第一,在排序過程中,執行完最後的排序後,雖然資料已全部排序完備,但程式無法判斷是否完成排序,為瞭解決這一不足,可設定一個標誌位flag,將其初始值設定為非0,表示被排序的表是一個無序的表,每一次排序開始前設定flag值為0,在進行資料交換時,修改flag為非0。在新一輪排序開始時,檢查此標誌,若此標誌為0,表示上一次沒有做過交換資料,則結束排序;否則進行排序;

/* * 冒泡排序函數改進版 */ public static void BubbleSort(int[] a) {   boolean flag = true;   while (flag) {    flag = false;    for (int i = 0; i < a.length - 1; i++) {     for (int j = 0; j < a.length - i ; j++) {      if (a[j] > a[j + 1]) {       int temp = a[j];       a[j] = a[j + 1];       a[j + 1] = temp;       flag = true;      }     }     if (!flag)      break; // 如果沒有發生交換,則退出迴圈     }   } }

第二、在冒泡排序中,一趟掃描有可能無資料交換,也有可能有一次或多次資料交換,在傳統的冒泡排序演算法及近年來的一些改進的演算法中,只記錄一趟掃描有無資料交換的資訊,對資料交換髮生的位置資訊則不予處理。為了充分利用這一資訊,可以在一趟全域掃描中,對每一反序資料對進行局部冒泡排序處理,稱之為局部冒泡排序。局部冒泡排序與冒泡排序演算法具有相同的時間複雜度,並且在正序和逆序的情況下,所需的關鍵字的比較次數和移動次數完全相同。由於局部冒泡排序和冒泡排序的資料移動次數總是相同的,而局部冒泡排序所需關鍵字的比較次數常少於冒泡排序,這意味著局部冒泡排序很可能在平均比較次數上對冒泡排序有所改進,當比較次數較少的優點不足以抵消其程式複雜度所帶來的額外開銷,而當資料量較大時,局部冒泡排序的時間效能則明顯優於冒泡排序。對於N個無序資料,我們在進行一趟冒泡排序時,如果第k個資料和第k+1個資料逆序,那麼對第k+1個資料進行一趟向前的冒泡排序,使其移動到合適的位置,也就是說讓前面k+1個資料調節為正序。因為這種冒泡法只對前k+1個資料冒泡處理,所以我們稱它為——局部冒泡

希望本文所述對大家的java程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.