3つの簡単なソートアルゴリズム-バブリング、選択、挿入ソート

1.バブリングソート
とは、左端から開始し、ソートするシーケンスに繰り返しアクセスし、一度に2つの要素を比較し、順序が間違っている場合はそれらを交換することを意味します。何度も何度も比較することで、要素が大きくなると、交換によってシーケンスの先頭にゆっくりと「フロート」するため、「バブル」という名前が付けられます。これは安定したソートアルゴリズムです。
実装:
1。従来の実装

public class BubbleSort {

    public static void main(String[] args) {
        int[] target = {
   
   1,7,6,4,5,2,9,4,6};
        //临时存储数据
        int temp = 0;
        for (int i = 0; i < target.length; i++) {
            for (int j = 0; j < target.length-1; j++) {
                //当左边的比右边的数字大则交换数据
                if(target[j] > target[j+1]) {   
                    temp = target[j];
                    target[j] = target[j+1];
                    target[j+1] = temp;
                }
            }
        }
        for (int i = 0; i < target.length; i++) {
        System.out.print(target[i] + " ");
        }
    }
}

上記のループのいくつかは実際には冗長であることがわかります。なぜですか?バブリングするたびに次の順序がすでに配置されているため、それらについて判断を繰り返す必要がないため、外側のループは配列の最後から始まります。ここでは、ループがループダウンするたびに、外側のループが始まります。後者はソートされているため、1減少します。
2.最適化は次のように実装されます。

public class BubbleSort {

    public static void main(String[] args) {
        int[] target = {
   
   1,7,6,4,5,2,9,4,6};
        //临时存储数据
        int temp = 0;
        //优化后
        for (int i = target.length-1; i > 1; i--) {
            for (int j = 0; j < i; j++) {
                if(target[j] > target[j+1]) {
                    temp = target[j];
                    target[j] = target[j+1];
                    target[j+1] = temp;
                }
            }
        }
        for (int i = 0; i < target.length; i++) {
        System.out.print(target[i] + " ");
        }
    }
}

バブルソートの時間計算量は次のとおりです。O(N²)

2.選択ソート
バブルソートが改善され、交換の数がO(N²)からO(N)に減り、比較の数は依然としてO(N²)です。安定したソートアルゴリズムではありません。
並べ替えるデータ要素から最小(または最大)の要素を選択するたびに、並べ替えるすべてのデータ要素が配置されるまで、シーケンスの最初に格納されます。
概要:配列内の前の要素と次の要素のサイズを比較します。次の要素が前の要素よりも小さい場合は、変数kを使用してその位置を記憶し、2番目の比較で前の「次の要素」が変化します。 「前の要素」になり、「次の要素」との比較を続けます。後者の要素が彼よりも小さい場合は、変数kを使用して配列内の位置(添え字)を記憶し、ループが終了するまで待ってから、交換新しい最小値と以前に選択した最小値。(Baidu百科事典)
実装:

public class SelectSort {
    
    

    public static void main(String[] args) {
        int[] target = {
   
   1,7,6,4,5,2,9,4,6};         
        int temp = 0;
        //暂存最小值的索引
        int index;
        for (int i = 0; i < target.length; i++) {
            index = i;
            for (int j = i+1; j < target.length; j++) {
                if(target[index] > target[j]) {
                    index = j;
                }
            }
            //交换
            temp = target[index];
            target[index] = target[i];
            target[i] = temp;
        }
        for (int i = 0; i < target.length; i++) {
            System.out.print(target[i] + " ");
        }
    }

}

ソートを選択する時間の複雑さは次のとおりです。O(N²)

3.挿入ソートソート
された順序データにデータを挿入し、番号に1を加えた新しい順序データを取得します。このアルゴリズムは、少量のデータをソートするのに適しています。安定したソート方法です。
挿入アルゴリズムは、並べ替えられる配列を2つの部分に分割します。最初の部分には最後の要素を除く配列のすべての要素が含まれ(配列に挿入用のスペースがもう1つあります)、2番目の部分にはこの要素のみが含まれます(挿入する要素)。最初の部分がソートされた後、この最後の要素をソートされた最初の部分に挿入します。
成し遂げる:

public class InsertSort {
    
    

    public static void main(String[] args) {
        int[] target = { 1, 7, 6, 4, 5, 2, 9, 4, 6 };
        //暂存待插数据
        int temp = 0;
        //暂存待插数据下标
        int index = 0;
        //从第二个数开始,因为第一个可以看做有序
        for (int i = 1; i < target.length; i++) {
            temp = target[i];
            index = i;
            while (index > 0 && target[index-1] >= temp) {
                target[index] = target[index - 1];
                index--;
            }
            target[index] = temp;
        }

        for (int i = 0; i < target.length; i++) {
            System.out.print(target[i] + " ");
        }
    }
}

挿入ソートの時間計算量はO(N²)ですが、データが基本的に順序付けまたは順序付けされている場合、挿入ソートの時間計算量はO(N)です。

これは、エントリ学習に適した比較的単純なソートアルゴリズムですが、後でより複雑なアルゴリズムがあります。

参照:Javaデータ構造とアルゴリズム(第2版)

おすすめ

転載: blog.csdn.net/u010857795/article/details/60469874