冒泡排序,冒泡效能最佳化--java實現

來源:互聯網
上載者:User

標籤:參考   sys   數列   log   應該   unit   str   問題:   sdn   

冒泡排序說明

一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。

重複地進行直到沒有再需要交換,也就是說已經排序完成。

越小的元素會經由交換慢慢“浮”到數列的頂端。

冒泡排序演算法的運作如下:
  1.  比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2.  對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3.  針對所有的元素重複以上的步驟,除了最後一個。
  4.  持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
簡單的冒泡排序代碼:
import java.util.Arrays;/** * 實現冒泡排序 * @author dell * */public class BubbleSort {    public static void main(String[] args) {        int[] arr = {1,200,19,55,10,22,3,7};        //API實現        Arrays.sort(arr);        System.out.println(Arrays.toString(arr));        //冒泡實現        int temp;        for(int i =0;i<arr.length-1;i++){            for(int j = 0;j<arr.length-1-i;j++){                if(arr[j]>arr[j+1]){                    temp = arr[j];                    arr[j]=arr[j+1];                    arr[j+1]=temp;                }            }        }        System.out.println(Arrays.toString(arr));    }}
冒泡排序的效能分析和演算法最佳化(外層迴圈最佳化)問題:

有的冒泡經過第一輪的交換已經是有序的了,如:2 1 3 4。資料越多的時候越慢,非常不適合大資料的排序

解決辦法

如果用一個flag來判斷一下,當前數組是否已經有序,如果有序就退出迴圈,這樣可以明顯的提高冒泡排序的效能。

 

package bubbleSort;import java.util.Arrays;import org.junit.Test;/** * 冒泡排序的效能分析和演算法最佳化(外層迴圈最佳化) * @author dell * */public class BubbeSort02 {    @Test    public void test1(){        boolean flag = true;        int[] arr = {2,1,3,4,5};        int temp;        for (int i = 0; i < arr.length-1; i++) {            for (int j = 0; j < arr.length-1-i; j++) {                if(arr[j]>arr[j+1]){                    temp=arr[j];                    arr[j]=arr[j+1];                    arr[j+1]=temp;                    flag=true;                }            }            if(!flag){                //沒有發生交換則退出迴圈;                break;            }        }        System.out.println(Arrays.toString(arr));    }}
冒泡排序第二種最佳化(內層迴圈最佳化)
    /**     * 冒泡排序的效能分析和演算法最佳化(內層迴圈最佳化)     */    @Test    public void test2(){                int[] arr = {22,1,10,5};                //標記最後一次交換的位置                        for (int i = 0; i < arr.length-1; i++) {            int flag = 0;            int temp;            for (int j = 0; j < arr.length-i-1; j++) {                if(arr[j]>arr[j+1]){                    temp=arr[j];                    arr[j]=arr[j+1];                    arr[j+1]=temp;                    //當位置發生改變,flag的值就發生變化                    flag=1;                }            }            //判斷標誌位flag有沒有發生變化,沒有就直接結束內層迴圈            if(flag==0){                return;            }        }        System.out.println(Arrays.toString(arr));    }}

 

參考連結

http://blog.csdn.net/pzhtpf/article/details/7560294

http://www.jianshu.com/p/ffcf5f97bc36

 

冒泡排序,冒泡效能最佳化--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.