グラフィカルな選択ソートアルゴリズムと最適化

ced485cbb11e458d81a746890b32cf3f.gif

作者:流川メイプルノックコード

ブログホームページ:流川楓のブログ

コラム:私と一緒にJavaを学ぼう

引用:ハングリーでいて、愚かでいて

良いことをしたいなら、まずツールを研ぎ澄ます必要があります.大手メーカーからのオファーを獲得するための超強力なツールを紹介しましょう-Niuke.com

クリックして無料で登録し、私と一緒に質問をブラッシングしてください    

記事ディレクトリ

1. アルゴリズム的思考

2. アルゴリズム図

3. コードの実装

4. 選択ソートアルゴリズムの最適化

5. 選択ソート機能


1. アルゴリズム的思考

1. 配列内の最大 (最小) 要素を見つける

2.配列の最初の要素と交換します(最初の要素が最大または最小の要素である場合は、自分自身と交換します)

3. 残りの要素の中から最大 (最小) の要素を見つけ、それを配列の 2 番目の要素と交換し、配列全体がソートされるまでループします

残った要素の中から最大(最小)の要素を連続的に選んで並べ替えるアルゴリズムなので、セレクションソートと呼ばれる

2. アルゴリズム図

配列配列ダイアグラムによるソートを選択すると、ソート結果は昇順になります

int[] array = {25,33,10,15,70,45};

 各ループの先頭にある最初の数値が常に最小であると仮定すると、minIndex は最小の数値の添字 i を保持します。i の範囲は 0 から array.length-1 です。

配列のトラバースを開始し、最小の数値を見つけ、インデックスを保存し、最小の数値を現在の minIndex が指す数値と交換します。

 最小数が 33 であると仮定して、逆方向にトラバースを開始し、最小数 15 を見つけて、スワップします。

 サイクルを続けて、現在25が最小、自分と交換

  サイクルを続けて、現在33が最小、自分と交換

 ループを継続し、最小数は 45 で、70 が交換されます

  サイクルを継続、現在70が最小、自分と交換

ここまで並べ替え完了

3. コードの実装

import java.util.Arrays;

public class ChoiceSort{
    public int[] sortArray(int[] nums){
        if(nums.length == 0){
            return nums;
        }
        for (int i = 0; i < nums.length; i++) {
            int minIndex = i;//最小数的下标,每个循环开始总是假设第一个数是最小数
            for (int j = i; j < nums.length; j++) {
                if (nums[j] < nums[minIndex]){//找到最小数
                    minIndex = j;//保存最小数索引
                }
            }
            System.out.println("本轮最小数:"+nums[minIndex]);
            //交换最小数和当前i所指向的元素
            int tmp = nums[minIndex];
            nums[minIndex] = nums[i];
            nums[i] = tmp;
            PrintArray.print(nums);
            System.out.println("————————————————");
        }
        return nums;
    }
    public static void main(String[] args) {
        int[] array = {25,33,10,15,70,45};
        System.out.println("初始数组:");
        PrintArray.print(array);
        ChoiceSort choiceSort = new ChoiceSort();
        choiceSort.sortArray(array);
        System.out.println("排序完成");
        PrintArray.print(array);
    }
}
class PrintArray{
    public static void print(int[] array){
        System.out.println(Arrays.toString(array));
    }
}

結果:

4. 選択ソートアルゴリズムの最適化

アイデア: 通常、1 回のトラバーサルで最大値と最小値を同時に見つけて、それらを配列の両端に配置すると、トラバーサルの回数を半分に減らすことができます

配列をトラバースして最大値と最小値を見つけ、最小値を配列の左側に置き、最大値を配列の右側に置き、並べ替えが完了するまで操作を繰り返します

コード: 

import java.util.Arrays;

public class ChoiceSort{
    public int[] sortArray(int[] nums) {
        if (nums.length == 0) {
            return nums;
        }
        /*初始化左端、右端元素索引*/
        int left = 0;
        int right = nums.length - 1;
        while (left < right) {
            /*初始化最小值、最大值元素的索引*/
            int min = left;
            int max = right;
            for (int i = left; i <= right; i++) {
                /*标记每趟比较中最大值和最小值的元素对应的索引min、max*/
                if (nums[i] < nums[min])
                    min = i;
                if (nums[i] > nums[max])
                    max = i;
            }
            /*最大值放在最右端*/
            int temp = nums[max];
            nums[max] = nums[right];
            nums[right] = temp;
            /*此处是先排最大值的位置,所以得考虑最小值(arr[min])在最大位置(right)的情况*/
            if (min == right)
                min = max;
            /*最小值放在最左端*/
            temp = nums[min];
            nums[min] = nums[left];
            nums[left] = temp;
            /*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/
            left++;
            right--;
        }

        return nums;
    }
    public static void main(String[] args) {
        int[] array = {25,33,10,15,70,45};
        System.out.println("初始数组:");
        PrintArray.print(array);
        ChoiceSort choiceSort = new ChoiceSort();
        choiceSort.sortArray(array);
        System.out.println("排序完成");
        PrintArray.print(array);
    }
}
class PrintArray{
    public static void print(int[] array){
        System.out.println(Arrays.toString(array));
    }
}

結果: 

5. 選択ソート機能

        ソート対象のシーケンスでは、要素数が少ない場合、選択ソートを使用するのが適切であり、
  ソート対象のシーケンスに元と等しい要素が存在する場合、時間計算量は O(n2) . になります。両端の要素、安定性が破壊される可能性があります

「この問題の共有はこちらです。ブロガーに 3 つのリンクを提供することを忘れないでください。あなたのサポートが私の創造の最大の原動力です!

ced485cbb11e458d81a746890b32cf3f.gif

おすすめ

転載: blog.csdn.net/chenchenchencl/article/details/126536612