1. 程式人生 > >排序——直接插入排序

排序——直接插入排序

設計思想

直接插入排序是將線性序列中的元素分為有序部分和待排序部分,每次第一個取待排序數進入排序部分查詢到相應位置插入,使有序部分依舊有序,直到整個序列有序。
演算法步驟:

  1. 將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最後一個元素當成是未排序序列。

  2. 從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。)

實現程式碼


public class StraightInsertionSort {
    public static void main(String[] args) {
        int
[] n={32,26,87,72,26,17}; insertSort(n); } public static void insertSort(int[] keys){ for (int i = 1; i < keys.length; i++) { int temp=keys[i],j; //進行升序排列 for (j = i-1;j>=0&&temp<keys[j]; j--) { keys[j+1]=keys[j]; //將大的元素後移
} keys[j+1]=temp;//將keys[i]插入到指定位置 System.out.print("temp="+temp+" out:\t"); print(keys); System.out.println(); } } public static void print(int[] keys){ for (int i = 0; i < keys.length; i++) { System.out
.print(keys[i]+"\t"); } } }

這裡寫圖片描述

演算法分析

設有n個元素,直接插入排序執行n-1趟,每次比較的次數和移動的次數與資料序列的初始排列有關。
1. 最好情況,一個排序的資料序列,如{1,2,3,4,5,6},直接插入排序比較的次數為n-1次,移動的次數為2(n-1)次,時間複雜度為O(n)
2. 最壞情況,一個反序的資料序列,如{7,6,5,4,3,2,1},第i趟移動i+2次,比較i次,最後移動的次數和比較的次數都約為(n*n)/2,所以時間複雜度為O(n^2)
總之,直接插入排序的時間複雜度在O(n)-O(n^2)之間,空間複雜度為O(1)
當插入的元素和有序部分相等時不會發生交換,所以相等元素的順序不會發生改變,所以直接插入排序是穩定的。
直接插入排序的動態動態圖
插入排序示意圖