構造とアルゴリズム(04):並べ替え規則と検索アルゴリズム

この記事のソースコード:GitHub・ここをクリック || GitEE・ここをクリック

1つの再帰アルゴリズム

再帰はそれ自体を呼び出すメソッドであり、呼び出されるたびに異なる変数を渡すため、コードを簡潔にすることができます。コンピュータサイエンスの再帰的アルゴリズムとは、問題を繰り返し類似のサブ問題に分解することによって問題を解決する方法を指します。再帰的方法は、多くのコンピュータサイエンスの問題を解決するために使用できるため、コンピュータサイエンスの非常に重要なものです概念。

基本的なケース:データを再帰的に印刷します。

public class M01_Recursion {
    public static void main(String[] args) {
        printNum(3);
    }
    private static void printNum (int num){
        if (num > 1){
            printNum(num-1);
        }
        System.out.println("num="+num);
    }
}

再帰図

構造とアルゴリズム(04):並べ替え規則と検索アルゴリズム

スタック構造の特性に基づいて、再帰呼び出しは上記の構造を形成し、すべての再帰メソッドがスタックに正常に配置されると、スタックアクションが順番に実行され、データ結果が出力されます。

実際の開発では、ツリー構造の問題、階乗アルゴリズム、ソートの検索、その他の数学的問題にアプローチするために、再帰がよく使用されます。

再帰アルゴリズムの条件は常に終了条件に近い必要があります。そうしないと、無限ループが発生してメモリオーバーフロー例外が発生しやすくなります。

第二に、並べ替えアルゴリズム

並べ替えアルゴリズムは、特定の並べ替え戦略に従ってデータレコードのグループを昇順または降順に並べ替える操作です。一般的に使用される並べ替えアルゴリズム:バブル並べ替え、選択並べ替え、挿入並べ替え、ヒル並べ替え、マージ並べ替え、クイック並べ替え、カーディナリティ並べ替えなど;並べ替えアルゴリズムの選択:さまざまな並べ替えサービスを複数のアルゴリズムでテストできます。複雑性が低く、時間のかかる優先使用が可能です。

1.バブルソート

並べ替え順序で隣接する要素の値を順番に比較することにより、逆の順序が見つかった場合、交換が実行され、値が大きい要素が前面から背面に徐々に移動します。アルゴリズムの名前は、要素が小さいほど、並べ替え交換を通じてゆっくりと浮かぶためです。シーケンスの一端は、炭酸飲料に含まれる二酸化炭素の泡が最終的に上に上がるようなもので、バブルソートという名前です。

public class M02_Bubble {
    public static void main(String[] args) {
        int[] arr = {3,7,5,9,6};
        bubbleSort(arr);
        for (int num:arr){
            System.out.println(num);
        }
    }
    public static void bubbleSort(int[] arr) {
        // 声明临时变量
        int temp = 0;
        // 排序总趟数
        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;
                }
            }
        }
    }
}

コアアイデア

ソートパスの要素数は、理論的には処理される回数です。各要素の位置交換には完全な比較が必要であり、外側のループが制御されます。内側のループは、個々の要素の位置を交換します。

2.並べ替えを選択

選択と並べ替えの原則:最小(または最大)の要素は、最初に並べ替えられるデータ要素から選択され、シーケンスの先頭に格納されます。次に、最小(大きい)要素が残りの並べ替えられていない要素から検出されます。次に、それをソートされたシーケンスの最後に置きます。以下同様に、ソートされるすべてのデータ要素の数がゼロになるまで。

public class M03_Selection {
    public static void main(String[] args) {
        int[] arr = {30,70,50,90,60};
        selectionSort(arr);
    }
    public static void selectionSort (int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            int minData = arr[i];
            for (int j = i + 1; j < arr.length; j++) {
                // 假设最小值判断
                if (minData > arr[j]) {
                    // 交换小值
                    minData = arr[j];
                    // 重置 minIndex,递增
                    minIndex = j;
                }
            }
            // 最小值交换放在arr[0]位置
            if (minIndex != i) {
                arr[minIndex] = arr[i];
                arr[i] = minData ;
            }
            System.out.println("第"+(i+1)+"轮排序:"+Arrays.toString(arr));
        }
    }
}

出力結果

第1轮排序:[30, 70, 50, 90, 60]
第2轮排序:[30, 50, 70, 90, 60]
第3轮排序:[30, 50, 60, 90, 70]
第4轮排序:[30, 50, 60, 70, 90]

3.挿入ソート

基本的な考え方は、並べ替えられた順序付きリストにレコードを挿入することです。並べ替え処理中に最初の要素が順序なしリストから取得されるたびに、それは順序付きリスト要素と順番に比較され、順序付きリストに挿入されます。テーブルシーケンスの適切な位置により、新しい順序付けされたテーブルになります。実装プロセスでは、二重ループが使用され、外側のループは最初の要素を除くすべての要素を検索し、内側のループは現在の要素の前の順序付きリストに挿入される位置を検索して移動します。

public class M04_Insert {
    public static void main(String[] args) {
        int[] arr = {10,40,90,20,80};
        insertSort(arr);
    }
    public static void insertSort (int[] arr) {
        int insertValue = 0;
        int insertIndex = 0;
        for (int i = 1; i < arr.length; i++) {
            // 待插入数的值和下标
            insertValue = arr[i];
            insertIndex = i - 1;
            // 写入位置
            while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            if (insertIndex + 1 != i) {
                arr[insertIndex + 1] = insertValue;
            }
            System.out.println("第" + i + "轮插入排序:"+Arrays.toString(arr));
        }
    }
}

出力結果

第1轮插入排序:[10, 40, 90, 20, 80]
第2轮插入排序:[10, 40, 90, 20, 80]
第3轮插入排序:[10, 20, 40, 90, 80]
第4轮插入排序:[10, 20, 40, 80, 90]

3、検索アルゴリズム

検索アルゴリズムとは、要素のグループから特定の情報要素を見つけることを指します。コンピュータアプリケーションでは、検索はコンパイラでのシンボルテーブルの検索などの一般的な基本操作です。一般的に使用される検索アルゴリズムは、順次検索、バイナリ検索、補間です。検索、フィボナッチ検索。

1.順番に検索

シーケンシャル検索は、シーケンスの元のシーケンスに従って要素のセットをトラバースし、検索する要素と1つずつ比較する基本的な検索アルゴリズムです。

public class M05_OrderFind {
    public static void main(String[] args) {
        String[] arr = {"first","second","third"};
        System.out.println(seqSearch(arr,"second"));
    }
    public static int seqSearch(String[] arr, String value) {
        // 数组下标,-1代表没有
        int findIndex = -1 ;
        // 遍历并逐个对比
        for (int i = 0; i < arr.length; i++) {
            if(value.equals(arr[i])) {
                return i ;
            }
        }
        return findIndex ;
    }
}

2.バイナリ検索

バイナリ検索は、バイナリ検索とも呼ばれ、効率的な検索方法です。ただし、バイナリ検索では、線形テーブルが順次ストレージ構造を採用する必要があり、テーブル内の要素はキーワード順に配置されます。

public class M06_BinaryFind {
    public static void main(String[] args) {
        int arr[] = { 10, 20, 30, 40, 50 };
        int index = binarySearch (arr, 0, arr.length - 1, 40);
        System.out.println("index="+index);
    }
    public static int binarySearch(int[] arr, int leftIndex, int rightIndex, int findValue) {
        // leftIndex > rightIndex,没有查到
        if (leftIndex > rightIndex) {
            return -1;
        }
        int midIndex = (leftIndex + rightIndex) / 2;
        int midValue = arr[midIndex];
        // 向左递归
        if (findValue < midValue) {
            return binarySearch(arr, leftIndex, midIndex - 1, findValue);
        // 向右递归
        } else if (findValue > midValue) {
            return binarySearch(arr, midIndex + 1, rightIndex, findValue);
        // 直接找到
        } else {
            return midIndex;
        }
    }
}

照会する要素が順序付けられていない場合は、まず要素を並べ替えてから、上記の2番目のモジュールの並べ替えアルゴリズムに基づいて検索できます。

第四に、ソースコードのアドレス

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

推奨読書:プログラミングシステムの仕上げ

シリアルナンバー プロジェクト名 GitHubアドレス GitEEアドレス オススメ
01 Javaは設計パターン、アルゴリズム、およびデータ構造を記述します GitHub・こちらをクリック GitEE・こちら ☆☆☆☆☆
02 Java基盤、並行性、オブジェクト指向、Web開発 GitHub・こちらをクリック GitEE・こちら ☆☆☆☆
03 SpringCloudマイクロサービス基本コンポーネントケースの詳細な説明 GitHub・こちらをクリック GitEE・こちら ☆☆☆
04 SpringCloudマイクロサービスアーキテクチャの包括的な事例 GitHub・こちらをクリック GitEE・こちら ☆☆☆☆☆
05 SpringBootフレームワークの基本的なアプリケーションから始めて上級者向け GitHub・こちらをクリック GitEE・こちら ☆☆☆☆
06 SpringBootフレームワークは、一般的なミドルウェアを統合および開発します GitHub・こちらをクリック GitEE・こちら ☆☆☆☆☆
07 データ管理、配布、アーキテクチャ設計の基本的なケース GitHub・こちらをクリック GitEE・こちら ☆☆☆☆☆
08 ビッグデータシリーズ、ストレージ、コンポーネント、コンピューティング、その他のフレームワーク GitHub・こちらをクリック GitEE・こちら ☆☆☆☆☆

おすすめ

転載: blog.51cto.com/14439672/2536477