[学習] 6つの挿入ソートアルゴリズム

社長、プログラムの猿を学習し、共有の愛は、**常にすべての結果は常にやりがいがあると信じています。**将来の成果を学び、知識の運命を変えます。いいえ勝利!私に従っていない、と私は一緒に学び、一緒に進行します。

1.挿入ソートは何ですか

挿入ソートは、(挿入ソート)、簡単かつ安定ソートアルゴリズムです。
基本的な挿入ソート操作は、すでに新しいを取得するためにデータを命じ、プラスソートアルゴリズムシーケンスされたデータの数は、少量のデータに適しています。ソートされたデータに挿入されます

2.発注原理

  1. データは2つの部分に切断して、一つはそれのいくつかは、一種のではない、(インデックス要素0、我々はすでにソートされていると信じて)がすでにソートされた(最初から1つの要素インデックス、我々は何の並べ替えがないことを信じています)
  2. 要素は、配列にソート、ソートされていない撮影しました
  3. 比較の前に元素ソートされたデータによって、から
    2例:
    **(1)**あなたは、ソートする必要があるのその位置から、それぞれの端に必要な挿入要素よりも小さい値を見つけることができます値は後方の1点の位置を移動する必要があります。
    **(2)**それは移動しない示し、見つけることができません
  4. まで、すべてのデータが完成するために挿入されている

    あなたについての一般的な考えロータリアンの話を与えるために社長を。
    挿入は、ソート、データがされ二つに切り、左側が発注され、権利が乱れています。順序付けられた配列から前方へ順に比べて障害の配列の最初の要素。なぜそれがもっと後ろから前にいるのですか?ロータリアンは、あなたが今まで考えたことはありますか?
    しかし、この時間は、私たちの隣の王、私が知っている社長、会長を、言って待つことができませんでした。左すでにソートされた上で、バックからフロントAの比較に、あなたが比較回数を減らすことができ、このパフォーマンスは最高です。
    言わなければ、隣の王、社長はあなたが賞賛与える、素晴らしいと述べました。

    最初の要素は、私たちが注文したデフォルトです理解を容易にするために、私は、プログラムによってプリントアウトし、対応する処理を入れて
排序的数组:[60, 71, 49, 11, 24, 3, 66]

待插入的值:71
待排序之前的数组:[60, 71, 49, 11, 24, 3, 66]
比较的值:7160,71大,保持不变
第1:排序后的数组为:[60, 71, 49, 11, 24, 3, 66]

待插入的值:49
待排序之前的数组:[60, 71, 49, 11, 24, 3, 66]
比较的值:4971,49大,交换位置
比较的值:4960,49大,交换位置
第2:排序后的数组为:[49, 60, 71, 11, 24, 3, 66]

待插入的值:11
待排序之前的数组:[49, 60, 71, 11, 24, 3, 66]
比较的值:1171,11大,交换位置
比较的值:1160,11大,交换位置
比较的值:1149,11大,交换位置
第3:排序后的数组为:[11, 49, 60, 71, 24, 3, 66]

待插入的值:24
待排序之前的数组:[11, 49, 60, 71, 24, 3, 66]
比较的值:2471,24大,交换位置
比较的值:2460,24大,交换位置
比较的值:2449,24大,交换位置
比较的值:2411,24大,保持不变
第4:排序后的数组为:[11, 24, 49, 60, 71, 3, 66]

待插入的值:3
待排序之前的数组:[11, 24, 49, 60, 71, 3, 66]
比较的值:371,3大,交换位置
比较的值:360,3大,交换位置
比较的值:349,3大,交换位置
比较的值:324,3大,交换位置
比较的值:311,3大,交换位置
第5:排序后的数组为:[3, 11, 24, 49, 60, 71, 66]

待插入的值:66
待排序之前的数组:[3, 11, 24, 49, 60, 71, 66]
比较的值:6671,66大,交换位置
比较的值:6660,66大,保持不变
第6:排序后的数组为:[3, 11, 24, 49, 60, 66, 71]

排序后的数组为:[3, 11, 24, 49, 60, 66, 71]

3.実際の記事

いくつかの単語の男は、コードにしました。

挿入ソートツール

package com.cxyxs.dilution.util;

import java.util.Arrays;

/**
 * Description:转发请注明来源  程序猿学社 - https://ithub.blog.csdn.net/
 * Author: 程序猿学社
 * Date:  2020/2/8 18:38
 * Modified By:
 */
public class InsertSortUtils {
    public  static  int[] insertSort(int[] insertSorts){
        //60,71,49,11,24,3,66
        System.out.println("排序的数组:"+Arrays.toString(insertSorts));
        System.out.println();
        for (int i = 1; i < insertSorts.length ; i++) {
            System.out.println("待插入的值:"+insertSorts[i]);
            System.out.println("待排序之前的数组:"+ Arrays.toString(insertSorts));
            for (int j = i; j > 0; j--) {
                if(insertSorts[j]<insertSorts[j-1]){
                    System.out.println("比较的值:"+ insertSorts[j]+"和"+insertSorts[j-1]+","+insertSorts[j]+"大,交换位置");
                    changeValue(j,j-1,insertSorts);
                }else{
                    System.out.println("比较的值:"+ insertSorts[j]+"和"+insertSorts[j-1]+","+insertSorts[j]+"大,保持不变");
                    break;
                }
            }
            System.out.println("第"+i+"轮:"+"排序后的数组为:"+Arrays.toString(insertSorts));
            System.out.println();
        }
        return insertSorts;
    };

    /**
     * 交换两个值
     * @param before
     * @param after
     * @param insertSorts
     */
    public static  void changeValue(int before,int after,int[] insertSorts){
        int temp=insertSorts[before];
        insertSorts[before]=insertSorts[after];
        insertSorts[after]=temp;
    }
}

テストカテゴリ

package com.cxyxs.dilution.test;

import com.cxyxs.dilution.util.InsertSortUtils;

import java.util.Arrays;

/**
 * Description: 【算法与结构】- 插入排序
 * 转发请注明来源  程序猿学社 - https://ithub.blog.csdn.net/
 * Author: 程序猿学社
 * Date:  2020/2/8 19:36
 * Modified By:
 */
public class Test6 {
    public static void main(String[] args) {
        //插入排序测试方法
        insertSort();
    }
    /**
     * 插入排序测试方法
     */
    public static void insertSort() {
        int[] insertSorts = {60, 71, 49, 11, 24, 3, 66};
        int[] ints = InsertSortUtils.insertSort(insertSorts);
        System.out.println("排序后的数组为:" + Arrays.toString(ints));
    }
}

**注:**ただ、これは何よりも、第6章ではアルゴリズムと構造列を学ぶのテストクラスのメソッドの一態様であることを知って、TEST6という名前の社長は、このコマンドなどのようであってはなりません。

4.時間計算の解析

区別するためにどのように良い点、悪いアルゴリズム、我々は時間の複雑さを見ることができます。
ロータリアンを忘れて、あなたが最初の章を参照してくださいすることができ
、なぜ学習アルゴリズムを、時間複雑

最も重要なの時間の複雑さを計算し、される最悪のシナリオは、なぜ?、計算された
前提の下では、データの順序を決定することはできません、我々は最悪のシナリオで計算することができます。私たちは何を行う直前に唯一の悪い事情が考慮されているように、我々は、最悪のケースを準備するために大きなたくさんの成功の私達のチャンスを必要とします。そうでなければ、アイデアはあまりにも良いですが、現実は残酷です。

最悪のケースの導出に。
71,66、60、49、24、11、3
ラウンドの最初のn-1の
2-N-の第二ラウンド
..........
N-1ラウンド:1
彼回数(N-1)+(N -2 )+ ... + 1は、
実際に演算シーケンス総和

社長によれば、前に述べたような長い高次の項ではなく、低レベルのアイテムとして、およびより高次の用語でない因子を行い
、時間複雑度の挿入ソートである(O N²) スペースの複雑さO(1)は、一定の時間を操作し、我々は彼が一定の操作だと思いました。

友人が私に何を賞賛のサポートを与えるように、元のは、容易ではありません。

githubの記事アルゴリズムのソースコード

公開された270元の記事 ウォンの賞賛448 ビュー190 000 +

おすすめ

転載: blog.csdn.net/qq_16855077/article/details/104228449
おすすめ