並べ替えアルゴリズム学習ノート(sorting algorithms)


メモの前に書いたら、ノートに使用する方法はアルゴリズム第四版から提供されたstdlib.jarの中にあります.ここに注文して、公式サイトにダウンロードしてもいいです.もしjarパッケージを導入しても、引用できない場合は、ホームページの一番下のQ&Aを参考にして、stdlib-package.jarをクリックしてから案内してください.
ソートアルゴリズムテンプレート(template for sorting algorithms)
          ,  ,          ,               ,  ,         ,            ,   ,  ,      ,             ,        ,        。
//  
Public static boolean less(Comparable c1, Comparable c2){
    return c1.compareTo(c2) < 0;
}

//  
Public static void exec(Comparable[] c,int I, int j){
    Comparable c1 = c[i];
    c[i] = c[j];
    c[j] = c1;
}

//      
Public static boolean isSorted(Comparable[] c){
    for(int I = 0; I < c.length; i++){
        if(less(c[i+1],c[i])) return false;
}
return true;
}

//       
Public static void show(Comparable[] c){
    for(int I = 0; I < c.length; i++)
        // StdOut             ,              
        StdOut.print(a[i] + “”);
StdOu.println();
}

//main  
Public static void main(String[] args){
          c;
    sort(c);
    //        ,            
    assert isSorted(c);
    show(c);
}
初級並べ替えアルゴリズムの選択順序
並べ替えの原理を選択
名前の通り、最小値を選択するたびに前に置いてください.配列【1、4、2、3、7、5】をStep 1に並べ替えます.最初のピットから配列を巡回し、最小値1を選んで、最初のピットの中にStep 2を入れます.2番目のピットから配列を遍歴し、最小値2を選択して、2番目のピットの中に入れます.Step 5:5番目のピットから配列を遍歴して、最小値5を選んで、5番目のピットの中に入れます.
アルゴリズムの実装
コードを下記のように整理します.
    Selection  
    ```
    package sort;


    /*
     *     ,         ,      
     */
    public class Selection {

        public static void sort(Comparable[] c) {

            SortBasicClass sbc = new SortBasicClass();
            for (int i = 0; i < c.length -1; i++) {
                int min = i;
                for (int j = i + 1; j < c.length; j++) {
                    //less  ,  
                    if (sbc.less(c[j], c[min])) {
                        min = j;
                    }
                }
                //exec  ,  
                sbc.exec(c, i, min);
            }
        }
    }

    ```

    SortBasicClass (        ,     ,        )

    ```
    package sort;

    import edu.princeton.cs.introcs.StdOut;

    public class SortBasicClass {

        // less  ,  
        public static boolean less(Comparable c1, Comparable c2) {

            return c1.compareTo(c2) < 0;
        }

        // exec  ,  
        public static void exec(Comparable[] c, int i, int j) {

            Comparable c1 = c[i];
            c[i] = c[j];
            c[j] = c1;
        }

        // isSorted  ,      ,       
        public static boolean isSorted(Comparable[] c) {

            for (int i = 0; i < c.length; i++) {
                for (int j = i + 1; j < c.length; j++) {
                    if (less(c[j], c[i]))
                        return false;
                }
            }
            return true;
        }

        // show  ,      
        public static void show(Comparable[] c) {
            for (int i = 0; i < c.length; i++)
                StdOut.print(c[i] + ",");
            StdOut.println();
        }
    }

    ```
    SortTestClass (   ,main  )


    ```
            package sort;

    import java.util.Random;
    import java.util.Scanner;

    import edu.princeton.cs.introcs.StdRandom;

    public class SortTestClass {

        public static void main(String args[]) {

            SelectionTest();
        }

        //        ,              
        public static void SelectionTest() {

            System.out.println("please input...");
            Scanner sc = new Scanner(System.in);
            char[] ch = sc.nextLine().toCharArray();
            Comparable[] c = new Comparable[ch.length];
            for (int i = 0; i < ch.length; i++) {
                c[i] = ch[i];
            }
            Selection.sort(c);
            assert SortBasicClass.isSorted(c);
            SortBasicClass.show(c);
        }
    }

    ```
一次並べ替えアルゴリズムの挿入順序
並べ替えの原理を挿入
配列を秩序化と無秩序の二つの部分に分けて,秩序化部分の適切な位置に順次,無秩序部分の要素を挿入した.配列【1、4、2、3、7、5】を例にとってStep 1:順序部分の無秩序部分は「/」で【1/4、2、3、7、5】を分割し、無秩序部分の最初の要素は4、4を順序部分の適切な位置すなわち1の後に配置し、並べ替え後の配列は【1、4、2、7、5】step 2:秩序部分の無秩序部分は‘3、【4/5】で分割されます.無秩序部分の最初の要素は2であり、2を秩序部分の適切な位置、すなわち1と4の間に置いて、並べ替え後の配列は【1、2、4、3、7、5】である.Step 6:秩序部分の無秩序部分は「/」で【1、2、4、7/5】を分割し、無秩序部分の最初の要素は5であり、順序部分の適切な位置、すなわち3と7の間に5を並べ替えて配列とする.【1、2、4、3、5、7】
アルゴリズムの実装
Insertion類
    ```
    package sort;

    /*
     *     ,           
     */
    public class Insertion {

        public static void sort(Comparable[] c){

            for (int i = 0; i < c.length; i++) {
                for (int j = i; j >0 && SortBasicClass.less(c[j], c[j-1]); j--) 
                    SortBasicClass.exec(c, j, j-1);
            }
        }
    }

    ```
テストクラスの並べ替えを選択します.コードは以下の通りです.
    ```
    package sort;

    import java.util.Random;
    import java.util.Scanner;

    import edu.princeton.cs.introcs.StdRandom;

    public class SortTestClass {

        public static void main(String args[]) {

            InsertionTest();

        }

        //        
            public static void InsertionTest() {

                Comparable[] c = new Comparable[100];
                for (int i = 0; i < 100; i++) {
                    c[i] = StdRandom.uniform(1, 100);
    //              c[i] = Math.random();
                }
                Insertion.sort(c);
                assert SortBasicClass.isSorted(c);
                SortBasicClass.show(c);
            }
    }

    ```
ソートアルゴリズムの性能比較(Sort Compare)
並べ替えアルゴリズムの性能を研究する時に、実験用の例を書いて実験をすることができます.以下はアルゴリズムの第四版SortCompre類を参照して書いた方法です.自分でNを調整することができます.Tの大きさを何度も検証します.私のコンピュータで並べ替えを選ぶ速度は大体挿入順序の1.7倍です.具体的な並べ替えアルゴリズムは上のテンプレートによって自分で書き出すことができます.
SortCompare   :

```
package sort;

import edu.princeton.cs.introcs.StdOut;
import edu.princeton.cs.introcs.StdRandom;
import edu.princeton.cs.introcs.Stopwatch;

//         
public class SortCompare {

    public static void main(String [] args){

        double SelectionTime = TimeRandomInput("Selection",100,20000);
        double InsertionTime = TimeRandomInput("Insertion",100,20000);

        StdOut.println("Selection costs " + SelectionTime + " seconds");
        StdOut.println("Selection costs " + InsertionTime + " seconds");
        StdOut.printf("Selection divided by Insertion is %.2f", SelectionTime/InsertionTime);
    }

    //          
    public static double time(String alg,Double[] d){

        Stopwatch timer = new Stopwatch();

        if(alg.equals("Selection")) Selection.sort(d);
        if(alg.equals("Insertion")) Insertion.sort(d);

        return timer.elapsedTime();
    }

    //      ,       
    public static double TimeRandomInput(String alg,int N,int T){

        double total = 0.0;
        Double[] d = new Double[N];
        for (int i = 0; i < T; i++) {

            for (int j = 0; j < d.length; j++) {

                d[j] = StdRandom.uniform();
            }

            total += time(alg,d);
        }


        return total;
    }
}





```