バブルソートと選択ソート

バブルソート

1.アイデア:バブルソートは、2つの隣接するデータに対してのみ機能します。各バブルソートは、2つの隣接する要素を比較して、サイズ関係の要件が満たされているかどうかを確認します。満足できない場合は、交換させてください。

2.図:配列[4、5、6、3、2、1]をバブルソートします。各バブル操作の詳細なプロセスを次の図に示します。
image.png

図から、array.length-1のバブリングのみが必要であり、配列を配置できることがわかります。

3.コードの実装

public void bubbleSort(int[] arr) {
    
            
   if (arr == null || arr.length < 2) return;
  
    // 需要进行arr.length - 1次冒泡
   for (int i = 0; i < arr.length - 1; i++) {
    
    
        // 每进行一次冒泡,下一次冒泡需要操作的元素数量减一
        for (int j = 0; j < arr.length - i - 1; j++) {
    
    
            if (arr[j] > arr[j + 1]) {
    
    
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

配列がarr.length-1バブルの前に配置されている場合は、バブルソートを行う必要はありません。この機能に基づいて最適化できます。

最適化されたバブルソート

public void bubbleSort(int[] arr) {
    
    
    if (arr == null || arr.length < 2) return;

    for (int i = 0; i < arr.length - 1; i++) {
    
    
    	boolean flag = true;  // 判断在一次冒泡中是否一次交换也没有发生
        for (int j = 0; j < arr.length - i - 1; j++) {
    
    
            if (arr[j] > arr[j + 1]) {
    
    
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                flag = false;  // 发生了交换,将flag设为false
            }
        }
       // 一次冒泡中若一次交换都没有发生,则排序已经完成,可提前结束冒泡排序
        if (flag)  return;  
    }
}

4.プロパティ:
①時間計算量:O(n ^ 2)②空間計算量:O(1)    
③安定したソート④安定したソート
:元の配列のaとbの値が同じ場合、aはbの前にあります、ソートが終了した後もaはbの前にあり、安定したソートです。
インプレースソート:ソートプロセスで余分なスペースは適用されません。

ソートを選択

1.アイデア:配列のソートされていない部分がトラバースされるたびに、最小(最大)値が選択され、ソートされていない部分の最初の要素と交換されます。

2.グラフィック:配列[4、5、6、3、2、1]を選択して並べ替えます。各交換の詳細なプロセスを次の図に示します。

image.png

3.コードの実装:

public void selectSort (int[] arr) {
    
    
    if (arr == null || arr.length < 2) return;
           
    for (int i = 0; i < arr.length - 1; i++) {
    
    
        // 假定最小值的下标为i
        int min = i;   
        for (int j = i + 1; j < arr.length; j++) {
    
    
            if (arr[j] < arr[min]) {
    
    
                // 改变最小值的下标
                min = j;   
            }
        }
        // 交换
        int temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
}

4.プロパティ:
①時間計算量:O(n ^ 2)
②空間計算量:O(1)③インプレースソート④不安定なソート:配列[4,5,4,6,1]の場合、初めてトラバースするとき、最初の4と最後の1が交換され、最初の4と2番目の4の順序が変更されるため、不安定なソートになります。

おすすめ

転載: blog.csdn.net/qq_46122005/article/details/112435065