java插入排序算法

en9 9年前發布 | 2K 次閱讀 Java 驗證 validation js

/**

  • 插入排序: *
  • 每次將一個待排序的數據元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序;直到待排序數據元素全部插入完為止。 /

public class InsertSort {

/**
 * 排序算法的實現,對數組中指定的元素進行排序
 *
 * @param array
 *            待排序的數組
 * @param from
 *            從哪里開始排序
 * @param end
 *            排到哪里
 * @param c
 *            比較器
 */
public void insert(Integer[] array, int from, int end) {

    /*
     * 第一層循環:對待插入(排序)的元素進行循環 從待排序數組斷的第二個元素開始循環,到最后一個元素(包括)止
     */
    for (int i = from + 1; i <= end; i++) {
        /**
         * 第二層循環:對有序數組進行循環,且從有序數組最第一個元素開始向后循環 找到第一個大于待插入的元素
         * 有序數組初始元素只有一個,且為源數組的第一個元素,一個元素數組總是有序的
         */
        for (int j = 0; j < i; j++) {
            Integer insertedElem = array[i];// 待插入到有序數組的元素
            // 從有序數組中最一個元素開始查找第一個大于待插入的元素
            if ((array[j].compareTo(insertedElem)) > 0) {
                // 找到插入點后,從插入點開始向后所有元素后移一位
                move(array, j, i - 1);
                // 將待排序元素插入到有序數組中
                array[j] = insertedElem;
                break;
            }
        }
    }

    // =======以下是java.util.Arrays的插入排序算法的實現
    /*
     * 該算法看起來比較簡潔一j點,有點像冒泡算法。 將數組邏輯上分成前后兩個集合,前面的集合是已經排序好序的元素,而后面集合為待排序的
     * 集合,每次內層循從后面集合中拿出一個元素,通過冒泡的形式,從前面集合最后一個元素開
     * 始往前比較,如果發現前面元素大于后面元素,則交換,否則循環退出
     *
     * 總感覺這種算術有點怪怪,既然是插入排序,應該是先找到插入點,而后再將待排序的元素插
     * 入到的插入點上,那么其他元素就必然向后移,感覺算法與排序名稱不匹,但返過來與上面實
     * 現比,其實是一樣的,只是上面先找插入點,待找到后一次性將大的元素向后移,而該算法卻 是走一步看一步,一步一步將待排序元素往前移
     */
    /*
     * for (int i = from; i <= end; i++) { for (int j = i; j > from &&
     * c.compare(array[j - 1], array[j]) > 0; j--) { swap(array, j, j - 1);
     * } }
     */
}

/**
 * 數組元素后移
 *
 * @param array
 *            待移動的數組
 * @param startIndex
 *            從哪個開始移
 * @param endIndex
 *            到哪個元素止
 */
public void move(Integer[] array, int startIndex, int endIndex) {
    for (int i = endIndex; i >= startIndex; i--) {
        array[i + 1] = array[i];
    }
}

/**
 * 測試
 *
 * @param args
 */
public static void main(String[] args) {
    Integer[] intgArr = { 5, 9, 1, 4, 2, 6, 3, 8, 0, 7, 15, -1, -9, 0 };
    InsertSort insertSort = new InsertSort();
    insertSort.insert(intgArr, 0, intgArr.length - 1);
    for (Integer intObj : intgArr) {
        System.out.print(intObj + " ");
    }
}

}</pre>

 本文由用戶 en9 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!