1. 程式人生 > >走進資料結構之排序(一)---直接插入排序

走進資料結構之排序(一)---直接插入排序

一、直接插入排序演算法分析

直接插入排序是假定前i個構成的子序列是處於已排序的情況下進行排序的,然後將第i個元素與前i個構成的子序列逆序進行比較,如果是要升序排序,則比較第i個元素是否比j=i-1(i-1需要>=0)的元素大,如果是則第i個元素的位置(即j+1的位置上)保持不動,反之則將j=i-1的元素放置到i的位置,再進行第i個元素與j=i-2(i-2需要>=0)的,依次進行,如果第i個元素剛好比j=i-3大,則將第i個元素插入到j=i-2(即j+1的位置)上!

二、程式碼實現

package top.einino.insertionsort;

public class StraightInsertionSort {

//直接插入排序,升序排序
public static void insertSortAsc(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];//將已經排好序的子序列逆序與temp相比,比temp大,就將位置空出來,自己往後移!
            }
            keys[j+1] = temp;


System.out.print("第"+i+"趟temp="+temp+"\t");
print(keys);
}
}
//直接插入排序,降序排序
public static void insertSortDesc(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;
System.out.print("第"+i+"趟temp="+temp+"\t");
print(keys);
}
}
//輸出排序陣列
private static void print(int[] keys) {
for(int key : keys){
System.out.print(key+" ");
}
System.out.println();
}

public static void main(String[] args) {
int[] keys = {32, 26, 87, 72, 26, 17};
//測試直接排序升序
StraightInsertionSort.insertSortAsc(keys);
int[] keys2 = {32, 26, 87, 72, 26, 17};
//測試直接排序降序
StraightInsertionSort.insertSortDesc(keys2);
}

}

三、形象的小例子!

體育課上老師需要將隊伍按身高進行升序排序,但學生們都不自覺,唯有老師自行排序,假設初始升高序列是A170,B165,C180,D177;

老師開始進行第一趟排序,首先老師把B學生給拉出隊伍,讓他跟學生A比較,結果B<A,則把A學生放到B學生的位置上,因為A學生前面沒有其餘的學生了,所以老師就把B學生放到A學生的位置上,然後結束了他第一趟的排序。此時隊伍順序是B165,A170,C180,D177

老師開始進行第二趟排序,老師將C學生拉出隊伍,讓他與學生A進行比較,結果C>A,既然C學生都比A學生高了,那肯定比前面的B學生還要高了,所以老師沒有進行接下來的比較,直接把A學生放回到原先的位置,此時隊伍順序是B165,A170,C180,D177

老師開始進行第三趟排序,老師將D學生拉出隊伍,讓他與學生C進行比較,結果D<C,則把C學生放到D學生的位置上,這樣C學生的位置就空出來了,接著老師再將D同學與A同學進行比較,結果D>C,則老師將D同學放置到了C學生的位置上,結束他第三趟的排序,此時隊伍順序是B165,A170,D177,C180

四、直接插入排序演算法的時間複雜度

排序演算法的時間複雜度由演算法執行中的元素比較次數和移動次數確定。

1、最好情況是:已經排好序的資料序列,比較次數為n-1,移動次數為2(n-1)(主要是引入了中間變數temp,每次比較都要移動2次),時間複雜度為O(n)

2、最壞情況是:一個反序的資料序列,比較次數為n*(n-1)/2,移動次數為(n-1)(n+4)/2,時間複雜度為O(n^2)

3、隨機排序,比較次數為n^2/4,移動次數為n^2/4,時間複雜度為O(n^2)

總之,直接插入排序演算法的時間效率是在O(n)到O(n^2)之間,資料序列的初始排列越接近有序,直接插入排序的時間效率越高。

五、直接插入排序演算法的空間複雜度

直接插入排序演算法中的temp佔用一個儲存單元,空間複雜度為O(1)

六、穩定性

在直接插入排序演算法中,關鍵字相等的元素會相遇進行比較,演算法不改變它們的原有次序,所以,直接插入排序演算法是穩定的。

七、小結

本博文從直接插入排序演算法分析,升序和降序程式碼實現,老師排隊的例子講演,時間複雜度的3種情況,空間複雜度以及穩定性介紹了直接插入排序的方方面面。

如果有疑問或者對該博文有何看法或建議或有問題的,歡迎評論,懇請指正!