基本排序_直接插入排序_Java實現

轉載請註明出處:http://blog.csdn.net/ljmingcom304/article/details/50370127
本文出自:【梁敬明的博客】

1.直接插入排序

  直接插入排序就是將序列中第一個元素作爲新的有序序列,然後從第二個元素開始將其插入有序序列的合適位置,以此類推將前n-1個元素作爲新的有序序列,從第n個元素開始將其插入有序序列的合適位置,直到完成序列的排序。

直接插入排序
  
  存在一個序列【7】【5】【9】【6】【8】,將其按照從小到大的順序進行排序。
  第一次排序,將元素【5】作爲有序序列,元素【5】比元素【7】小,則將元素【5】插入到元素【5】前。
  第二次排序,將元素【5】【7】作爲有序序列,元素【9】比前兩個元素都大,位置不變。
  第三次排序,將元素【5】【7】【9】作爲有序序列,元素【6】比元素【5】大,比元素【7】小,將元素【6】插入到元素【5】和元素【7】之間。
  第四次排序,將元素【5】【6】【7】【9】作爲有序序列,元素【8】比元素【7】大,比元素【9】小,將元素【8】插入到元素【7】和元素【9】之間。

2.示例代碼

  對一個長度爲N的序列從小到大進行排序,選取前N-1個元素作爲有序序列,將第N個元素插入前N-1個元素中的合適位置作爲新的有序序列。

public class InsertSort {

    public static void main(String[] args) {
        int[] array = { 4, 7, 8, 6, 5, 9, 3, 0, 2, 3 };
        InsertSort.sort(array);
        System.out.println("排序後數組:" + Arrays.toString(array));
    }

    public static void sort(int[] a) {
        // 第一個數是有序的,從第二個數開始遍歷,依次插入有序序列
        for (int i = 1; i < a.length; i++) {
            int j = 0;
            int temp = a[i];// 取出第i個數,和第i-1個數進行比較,插入合適位置
            if (temp >= a[i - 1])// 第i個數比有序序列的最後一個數大,則進行下一次循環
                continue;
            for (j = i - 1; j >= 0 && temp < a[j]; j--) {
                // 將比temp大的元素後移
                a[j + 1] = a[j];
            }
            a[j + 1] = temp;
        }
    }

}

3.算法分析

時間複雜度:
  當序列爲正序時,比較次數爲Cmin=n1 ,所以直接插入排序的最好時間複雜度爲O(n)
  當序列爲逆序時,比較次數爲Cmax=(n1)(ni) ,所以直接插入排序的最壞時間複雜度爲O(n2)
  直接插入排序的平均時間複雜度爲O(n2)
算法穩定性:
  直接插入排序中相同元素的前後位置不會發生改變,是一種穩定的排序算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章