冒泡排序及優化


1.冒泡排序定義:

冒泡排序是最簡單最容易理解的排序算法之一,其思想是通過無序區中相鄰記錄關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上“漂浮”直至“水面”。

 

2.普通版:

/** * 一般排序 */
    private void bubbleSort0() { int[] is             ={95,85,12,52,64,74,105,502,4,7,6,1,74,60,141,19,34,45,59}; Log.i(TAG, "開始--"+ Arrays.toString(is)); int handleCount=0; int swapCount=0; for (int i=0;i<is.length-1;i++){ for (int j=0;j<is.length-1;j++){ if (is[j]>is[j+1]){ swap(is,j,j+1); swapCount++; } handleCount++; } } Log.i(TAG, "bubbleSort0: --handleCount:"+handleCount+",swapCount:"+swapCount+"\r\n"+ Arrays.toString(is)); }

2.1:輸出結果:

 

 3.優化版:

  冒泡排序過程中,可以檢測到整個序列是否已經排序完成,進而可以避免掉后續的循環

 3.1代碼:

/** * 在非最壞的情況下,冒泡排序過程中,可以檢測到整個序列是否已經排序完成,進而可以避免掉后續的循環: */
    private void bubbleSort1() { int[] is             ={95,85,12,52,64,74,105,502,4,7,6,1,74,60,141,19,34,45,59}; Log.i(TAG, "開始--"+ Arrays.toString(is)); int handleCount=0; int swapCount=0; for (int i=0;i<is.length-1;i++){ boolean isSwap=false; for (int j=0;j<is.length-1;j++){ if (is[j]>is[j+1]){ swap(is,j,j+1); swapCount++; isSwap=true; } handleCount++; } if (!isSwap){ break;//已經沒有交換了,跳出循環 } } Log.i(TAG, "bubbleSort1: --handleCount:"+handleCount+",swapCount:"+swapCount+"\r\n"+ Arrays.toString(is)); }

 3.2輸出結果:

 

 4.再次優化版: 

  在每輪循環之后,可以確認,最后一次發生交換的位置之后的元素,都是已經排好序的,因此可以不再比較那個位置之后的元素

4.1代碼:

/** * 進一步地,在每輪循環之后,可以確認,最后一次發生交換的位置之后的元素,都是已經排好序的,因此可以不再比較那個位置之后的元素,大幅度減少了比較的次數: */
    private void bubbleSort2() { int[] is             ={95,85,12,52,64,74,105,502,4,7,6,1,74,60,141,19,34,45,59}; Log.i(TAG, "開始--"+ Arrays.toString(is)); int handleCount=0; int swapCount=0; int n=is.length-1; for (int i=0;i<is.length-1;i++){ int newN=0; for (int j=0;j<n;j++){ if (is[j]>is[j+1]){ swap(is,j,j+1); swapCount++; newN=j+1; } handleCount++; } n=newN; if (n==0){//位置沒有變化說明已經交換好了,跳出循環
                break; } } Log.i(TAG, "bubbleSort2: --handleCount:"+handleCount+",swapCount:"+swapCount+"\r\n"+ Arrays.toString(is)); }

 4.2輸出結果:

 

5.進一步優化: 

  進行雙向的循環,正向循環把最大元素移動到末尾,逆向循環把最小元素移動到最前

5.1代碼:

/** *進行雙向的循環,正向循環把最大元素移動到末尾,逆向循環把最小元素移動到最前 */
    private void bubbleSort3() { int[] is             ={95,85,12,52,64,74,105,502,4,7,6,1,74,60,141,19,34,45,59}; Log.i(TAG, "開始--"+ Arrays.toString(is)); int handleCount=0; int swapCount=0; int endPoint=is.length-1; int startPoint=0; while (startPoint<=endPoint){ int newEndPoint=startPoint; int newStartPoint=endPoint; for (int j=startPoint;j<endPoint;j++){ if (is[j]>is[j+1]){ swap(is,j,j+1); swapCount++; newEndPoint=j+1; } handleCount++; } endPoint=newEndPoint-1;//這里一個元素已經沉底了,所以下一次交換次數相比於最后一次交換要少1
            for (int j=endPoint;j>startPoint;j--){ if (is[j]<is[j-1]){//后一個元素小於上一個元素,往上移動一次
                    swap(is,j,j-1); swapCount++; newStartPoint=j-1; } handleCount++; } startPoint=newStartPoint+1;//這里一個元素到最上面了,所以下一次交換次數相比於上一次交換要少1
 } Log.i(TAG, "bubbleSort3: --handleCount:"+handleCount+",swapCount:"+swapCount+"\r\n"+ Arrays.toString(is)); }

 5.2輸出結果:

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



冒泡排序及其優化 冒泡排序及其優化 冒泡排序及優化 優化的冒泡排序 冒泡排序及優化 冒泡排序及其優化 如何優化冒泡排序? 冒泡排序及其優化 冒泡排序及其優化 冒泡排序及其優化
 
粤ICP备14056181号  © 2014-2020 ITdaan.com