插入排序(英語:insertion sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
快速排序示意過程
插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為o(n^2)。 是穩定的排序方法。
設有一組關鍵字{k1, k2,…, kn};排序開始就認為 k1 是乙個有序序列;讓 k2 插入上述表長為 1 的有序序列,使之成為乙個表長為 2 的有序序列;然後讓 k3 插入上述表長為 2 的有序序列,使之成為乙個表長為 3 的有序序列;依次類推,最後讓 kn 插入上述表長為 n-1 的有序序列,得乙個表長為 n 的有序序列。
具體演算法描述如下:
從第乙個元素開始,該元素可以認為已經被排序
取出下乙個元素,在已經排序的元素序列中從後向前掃瞄
如果該元素(已排序)大於新元素,將該元素移到下一位置
重複步驟 3,直到找到已排序的元素小於或者等於新元素的位置
將新元素插入到該位置後
重複步驟 2~5
如果比較操作的代價比交換操作大的話,可以採用二分查詢法來減少比較操作的數目。該演算法可以認為是插入排序的乙個變種,稱為二分查詢排序。
二分查詢法,是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。
下面舉個例子,初始陣列
我們把第乙個元素12作為已經排序號的陣列,用中括號括起來,方便我們觀察
那麼初始陣列:[12], 15, 9, 20, 6, 31, 24
第一步,拿著15和12比較,發現15大於12,把15插入到12後面,於是當前陣列變成
陣列結果:[12, 15 ], 9, 20, 6, 31, 24
第二步,拿著9和15比較,發現15>9,把15向後面移動一位,在把9和12比較發現12>9,把12向後移動一位,最後把9插入
陣列結果:[9,12, 15 ], 20, 6, 31, 24
第三步,拿著20和15比較,發現15<20,不需要調整
陣列結果:[9,12, 15 ,20], 6, 31, 24
如此執行下去,直到所有排序完成,
上面一張圖能完美的展示整個排序過程 ,其中虛線代表while中迴圈執行的,
#include
#include
using namespace std;
void insertsort(int a, int n)
a[i + 1] = key;//找到合適的位置了,賦值,在i索引的後面設定key值。}}
int main() ;
cout << "輸入陣列 " << endl;
insertsort(d,7);
cout << "排序後結果:";
for (int i = 0; i < 7; i++)
//return 0;
}程式執行結果:
常見排序演算法 - 插入排序 (insertion sort)
c++ 插入排序演算法
插入排序之折半插入排序(c 實現)
插入排序有直接插入排序,折半插入排序 又叫二分插入排序 鍊錶插入排序,希爾排序等。在排序中屬於穩定排序型別。折半插入排序的演算法思想 1 計算 0 i 1 的中間點,用 i 索引處的元素與中間值進行比較,如果 i 索引處的元素大,說明要插入的這個元素應該在中間值和剛加入i索引之間,反之,就是在剛開始...
C 實現排序演算法之插入排序
include include include using namespace std void print int arr,int len cout endl void insertsort int arr,int len arr j 1 basic void main int len sizeo...
排序之插入排序 Java實現
在計算機的實現中,為了給要插入的元素騰出空間,我們需要將其餘所有元素在插入之前都向右移動一位。對於乙個很大且其中的元素已經有序 或接近有序 的陣列進行排序將會比對隨機順序的陣列或是逆序陣列進行排序要快得多。對於隨機排列的長度為n且主鍵不重複的陣列,平均情況下插入排序需要 public class i...