大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java實現冒泡排序算法及對其的簡單優化示例

Java實現冒泡排序算法及對其的簡單優化示例

更新時間:2019-09-08 09:00:00 來源:動力節點 瀏覽12094次

今天動力節點java培訓機構小編為大家介紹Java實現冒泡排序算法及對其的簡單優化示例,冒泡排序的最差時間復雜度為O(n^2),最優時間復雜度為O(n),存在優化的余地,希望能夠幫助到正在學習java的零基礎學員,下面就隨小吧一起看看吧。

  Java實現冒泡排序原理

  java冒泡排序大概是所有程序員都會用的算法,也是最熟悉的算法之一。

  它的思路并不復雜:

  設現在要給數組arr[]排序,它有n個元素。

  1、如果n=1:顯然不用排了。(實際上這個討論似乎沒什么必要)

  2、如果n>1:

  (1)我們從第一個元素開始,把每兩個相鄰元素進行比較,如果前面的元素比后面的大,那么在最后的結果里面前者肯定排在后面。所以,我們把這兩個元素交換。然后進行下兩個相鄰的元素的比較。如此直到最后一對元素比較完畢,則第一輪排序完成??梢钥隙?,最后一個元素一定是數組中最大的(因為每次都把相對大的放到后面了)。

  (2)重復上述過程,這次我們無需考慮最后一個,因為它已經排好了。

 ?。?)如此直到只剩一個元素,這個元素一定是最小的,那么我們的排序可以結束了。顯然,進行了n-1次排序。

  上述過程中,每次(或者叫做“輪”)排序都會有一個數從某個位置慢慢“浮動”到最終的位置(畫個示意圖,把數組畫成豎直的就可以看出來),就像冒泡一樣,所以,它被稱為“冒泡排序法”。

  代碼實現:

public class BubbleSort{
? ?public static void main(String[] args){
? ? ?int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
? ? ?for (int i = 0; i < score.length -1; i++){? //最多做n-1趟排序
? ? ? ?for(int j = 0 ;j < score.length - i - 1; j++){? //對當前無序區間score[0......length-i-1]進行排序(j的范圍很關鍵,這個范圍實在逐步縮小的)
? ? ? ? ?if(score[j] < score[j + 1]){? //把小的值交換到后面
? ? ? ? ? ?int temp = score[j];
? ? ? ? ? ?score[j] = score[j + 1];
? ? ? ? ? ?score[j + 1] = temp;
? ? ? ? ?}
? ? ? ?}? ? ??

? ? ? ?System.out.print("第" + (i + 1) + "次排序結果:");
? ? ? ?for(int a = 0; a < score.length; a++){
? ? ? ? ?System.out.print(score[a] + "\t");
? ? ? ?}
? ? ? ?System.out.println("");
? ? ?}

? ? ? ?System.out.print("最終排序結果:");
? ? ? ?for(int a = 0; a < score.length; a++){
? ? ? ? ?System.out.print(score[a] + "\t");
? ? ?}
? ?}
?}

算法性能/復雜度

  我們忽略掉循環變量自增和初始化的時間。先分析算法的比較次數。容易看出,上面這種未經任何改進的冒泡排序無論輸入數據如何都會進行n-1輪排序,而每輪排序需要比較的次數從n-1遞減到0。那么,總的比較次數即是 (n-1)+(n-2)+...+2+1 = (n-1)n/2≈(n^2)/2。

  再來看下賦值次數。這里的賦值是指其中的交換操作,對于上述代碼,1次交換等于三次賦值。由于并非每次都必須交換,因此,賦值操作的次數與輸入數據有關。最佳情況(best case)下,即一開始就是有序的情況下,賦值次數為0。 而最壞情況(worst case)下,賦值次數為(n-1)n/2。假設輸入數據平均(或者說“完全隨機”)分布,那么大約有交換次數為比較次數的一半。由上面的結果,可以得到平均情況(average case)下,賦值次數為 3/2 * (n^2)/2 = 3/4*(n^2).

  綜上,無論在何種情況下,冒泡排序空間復雜度(額外空間)總是O(1)。

  改進

  在數據完全有序的時候展現出最優時間復雜度,為O(n)。其他情況下,幾乎總是O(n^2)。因此,算法在數據基本有序的情況下,性能最好。

  但是,上面的代碼怎么可能出現O(n)復雜度呢?實際上,因為上面注重的是基本思路,因此只是最簡單情況,要使算法在最佳情況下有O(n)復雜度,需要做一些改進,改進后的代碼為:

public static void bubbleSort(int[] arr) {
? int temp = 0;
? boolean swap;
? for (int i = arr.length - 1; i > 0; --i) { // 每次需要排序的長度
? ? swap=false;
? ? for (int j = 0; j < i; ++j) { // 從第一個元素到第i個元素
? ? ? if (arr[j] > arr[j + 1]) {
? ? ? ? temp = arr[j];
? ? ? ? arr[j] = arr[j + 1];
? ? ? ? arr[j + 1] = temp;
? ? ? ? swap=true;
? ? ? }
? ? }//loop j
? ? if (swap==false){
? ? ? break;
? ? }
? }//loop i
}// method bubbleSort

實際上,由于在大量數據的情況下幾乎不使用冒泡排序,而使用小數據的時候增加的布爾變量反而會造成額外的開銷。

  算法穩定性

  容易看出,在相鄰元素相等時,我們并不需要交換它們的位置,所以,冒泡排序是穩定排序。

  算法適用場景

  冒泡排序思路簡單,代碼也簡單,特別適合小數據的排序。但是,由于算法復雜度較高,在數據量大的時候不適合使用。如果一定要在較多數據的時候使用,最好對算法加以改進,例如選擇排序法。

以上就是動力節點java培訓機構小編介紹的“Java實現冒泡排序算法及對其的簡單優化示例”的內容,希望能夠幫助到大家,更多java最新資訊請繼續關注動力節點java培訓機構官網,每天會有精彩內容分享與你。

相關免費視頻教程推薦

java新手入門教程下載之冒泡排序分析:http://m.dabaquan.cn/xiazai/2539.html

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧美日韩乱码毛片免费观看 | 国外成人在线视频 | 有色视频在线观看免费高清 | 欧美精品久久久久久久免费观看 | 欧美另类69xxxxx 视频 | 国产这里只有精品 | 婷婷色中文字幕 | 9re视频这里只有精品 | 九九99久久精品午夜剧场免费 | 九九伊人网 | 在线视频日韩精品 | 国产午夜精品福利视频 | 免费一级毛片清高播放 | 成人欧美一区二区三区黑人免费 | 欧美亚洲图片 | 夜鲁夜鲁夜鲁在线观看福利 | 国产精品久久久久久久hd | 国产美女亚洲精品久久久久久 | 日韩三级一区二区 | 涩涩视频网 | 性做久久久久久久免费看 | 中文字幕色婷婷在线精品中 | 2021久久伊人精品中文字幕有 | 全黄大全大色全免费大片 | 精品久久久久久久中文字幕 | 精品国产亚洲一区二区三区 | 麻豆精品一区 | 国产亚洲精品一区二区在线播放 | 国产精品久久现线拍久青草 | 久在线视频 | 亚洲人成高清 | 热99re久久精品这里都是免费 | 伊人插插| 久久女人天堂 | 四虎影永久在线高清免费 | 亚洲欧美日韩国产色另类 | a高清免费毛片久久 | 一级无遮挡理论片 | 欧美日韩中文字幕在线 | 欧美大陆日韩一区二区三区 | 香蕉久久综合 |