排序---插入排序實現和性能分析

插入排序

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = new int[10];
        Random random = new Random();
        for(int i = 0; i < 10; i++) {
            arr[i] = random.nextInt(10);
        }
        Arrays.stream(arr).forEach(System.out::print);
        insertSort(arr);
        System.out.println("");
        Arrays.stream(arr).forEach(System.out::print);
    }

    public static void insertSort(int[] arr) {
        int length = arr.length;
        int index;
        int item;

        for(int i = 1; i < length; i++) {
            index = i - 1;
            item = arr[i]; //待插入的元素

            while(index >= 0 && item < arr[index]) {
                arr[index + 1] = arr[index];
                index--;
            }

            arr[index + 1] = item;
        }
    }
}

性能分析

  1. 空間複雜度爲O(1)
  2. 在插入排序中,對於值相同的元素,可以選擇將後面出現的元素,插入到前面出現元素的後面,這樣就可以保持原有的前後順序不變,所以插入排序是穩定的排序算法。
  3. 假設待排序的n個元素有序,則每次將第i個元素往前i-1個已經有序的元素中插入時,一次比較即可找到插入的位置,因此最好情況時間複雜度爲O(n)
    假設待排序的n個元素逆序,則每次將第i個元素往前i-1個已經有序的元素中插入時,每次都需要遍歷完前i-1個元素才能找到插入位置,因此最壞情況時間複雜度爲O(n^2)
    往有序數組中插入一個元素的平均時間複雜度爲O(n),所以,對於插入排序操作,每次將第i個元素插入到前i-1個元素中時,找插入的位置的時間複雜度爲O(i-1),所以平均時間複雜度爲O(n^2)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章