排序之直接插入排序和折半插入排序

2021-08-14 04:03:14 字數 968 閱讀 7432

直接插入排序時將乙個記錄插入到乙個已經有序的的表或者陣列中,從而得到乙個新的有序的表或者陣列。

就像打牌一樣,拿到一張牌後,要往手中的牌裡插,使手中的牌還是有序的。假如手中有4,6,7三張牌,現在拿到的下一張牌是5,那麼肯定要插在4之後,直接插入排序也是這個道理。

假如現在有陣列:,直接插入排序的過程如下:

**實現如下:

void insertsort(int a, int n) 

a[j + 1] = temp;}}

分析發現上圖中當待插關鍵字為78時,78比前面的乙個大,就沒有必要進行這一趟排序,所以可以在進行每一趟排序之前,判斷是否需要進行。

**實現如下:

void insertsort(int a, int n) 

a[j + 1] = temp;}}

}

直接插入排序的最好的情況是原本需要排序的陣列就是有序的,那麼它只需要比較即可,但是如果是最壞情況,即陣列是反序的,那麼他的時間複雜度就會比較大,所以最後他的平均時間複雜度為o(

n2) 。直接插入排序是簡單排序中時間複雜度比較穩定的排序演算法。

直接插入排序時一種穩定的排序。

我們知道對於陣列折半查詢要比順序查詢快,通過這個點可以對直接插入排序進行優化。之前在找待插關鍵字位置的時候使用的是順序查詢比較,現在將之前的順序查詢改為折半查詢。

void biinsertsort(int a, int n) 

for (j = i - 1; j >= low; j--)

a[j + 1] = a[j]; // 記錄後移

a[low] = temp;

} }

}

原始碼鏈

插入排序(直接插入排序 折半插入排序和希爾排序)

所謂插入排序就是將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中,直到全部記錄插入完成。1.直接插入排序 假設在排序過程中,待排序表l 1 n 在某次排序過程中的某一時刻狀態如下 為了實現將元素l i 插入到已有序列的子串行l 1 i 1 中,需要執行以下操作 1 查詢l i 在l ...

插入排序之直接插入排序和折半插入排序

插入排序的基本思想是 將記錄分為有序和無序兩個序列。從無序序列中任取乙個記錄,然後根據該記錄的關鍵字大小在有序序列中查詢乙個合適的位置,使得該記錄放入這個位置後,這個有序序列仍然有序。每插入乙個記錄就稱為一趟插入排序,經過多趟插入排序,使得無序序列中的記錄全部插入到有序序列中,則排序完成。直接插入排...

直接插入排序和折半插入排序

1.直接插入排序 1.1插入排序 insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.1.2 基本過程 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直到i ...