クラシック・ソート・アルゴリズム-クイック・ソートと挿入ソート

1708 ワード

大工場の面接の時、よくアルゴリズムの問題を聞いて、この間、手書きで速いアルゴリズムを書くように要求されました.これらは学校に通っていた时に学んだことがありますが、普段は関心が少ないし、コードが読めばわかると思っていた人も多く、自分が身につけたと思っていましたが、しばらくして自分に書いてもらうと忘れてしまいました.実は结局やはりアルゴリズムの本当の思想を理解していないで、ただ単纯に他の人の考えに従って歩いて、そのわけが分からないことを知っていて、时間が経つと自然に忘れてしまいました.
クイックソート
クイックソートは、要素を持って位置を探すアルゴリズムに属します.構想は非常に簡単明瞭で、まず最初の要素に正しい位置を見つけてそれを配置して、この時この要素は元の配列を半分に分けて、左半分の要素はすべてそれより小さくてあるいは等しくて、右半分の要素はすべてそれより大きくて、この2つのサブ配列に対してさっきの操作を繰り返して、サブ配列の中で1つの要素があるまで、この時並べ替えは完成します.
/**
 * @param s
 * @param i    
 * @param j    
 */
public static void quickSort(int[] s, int i, int j) {
    if (i < j) {
        int left = i, right = j, inser = s[i];
        while (left < right) {
            while (left < right && inser < s[right])
                right--;//     
            if (left < right) s[left++] = s[right];//     

            while (left < right && inser > s[left]) left++;
            if (left < right) s[right--] = s[left];
        }
        s[left] = inser;

        quickSort(s, i, left - 1);
        quickSort(s, left + 1, j);
    }

}

直接挿入ソート
順序付けの考え方を挿入し、まず順序付けされたシーケンスを指定し、後続の値を前の順序付けされた値と順次比較し、前の値より小さい場合は前列に挿入し、常にこのようにして後続の値をループします.例えば、1番目の要素を秩序値として、2番目の要素と1番目の要素を比較し、比較結果に基づいて、両者の位置を秩序化し、3番目の要素と前の2つの要素を比較し、N番目の要素がソートされるまで、ソート結果に基づいて秩序化します.
  public static void insetSort(int[] data) {
    for (int i = 1; i < data.length ; i++) {
        int temp = data[i];//        
        int j = i - 1;

        while (j >= 0 && temp < data[j]) {
            // data[j]  
            data[j + 1] = data[j];
            //j     
            j--;
        }
        data[j + 1] = temp;//  temp        
    }
}