W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
「插入排序 insertion sort」是一種簡(jiǎn)單的排序算法,它的工作原理與手動(dòng)整理一副牌的過程非常相似。
具體來說,我們?cè)谖磁判騾^(qū)間選擇一個(gè)基準(zhǔn)元素,將該元素與其左側(cè)已排序區(qū)間的元素逐一比較大小,并將該元素插入到正確的位置。
圖 11-6 展示了數(shù)組插入元素的操作流程。設(shè)基準(zhǔn)元素為 base ,我們需要將從目標(biāo)索引到 base 之間的所有元素向右移動(dòng)一位,然后再將 base 賦值給目標(biāo)索引。
圖 11-6 單次插入操作
插入排序的整體流程如圖 11-7 所示。
圖 11-7 插入排序流程
insertion_sort.cpp
/* 插入排序 */
void insertionSort(vector<int> &nums) {
// 外循環(huán):已排序元素?cái)?shù)量為 1, 2, ..., n
for (int i = 1; i < nums.size(); i++) {
int base = nums[i], j = i - 1;
// 內(nèi)循環(huán):將 base 插入到已排序部分的正確位置
while (j >= 0 && nums[j] > base) {
nums[j + 1] = nums[j]; // 將 nums[j] 向右移動(dòng)一位
j--;
}
nums[j + 1] = base; // 將 base 賦值到正確位置
}
}
插入排序的時(shí)間復(fù)雜度為
這個(gè)結(jié)論與線性查找和二分查找的適用情況的結(jié)論類似??焖倥判蜻@類
實(shí)際上,許多編程語(yǔ)言(例如 Java)的內(nèi)置排序函數(shù)都采用了插入排序,大致思路為:對(duì)于長(zhǎng)數(shù)組,采用基于分治的排序算法,例如快速排序;對(duì)于短數(shù)組,直接使用插入排序。
雖然冒泡排序、選擇排序和插入排序的時(shí)間復(fù)雜度都為 O(n2) ,但在實(shí)際情況中,插入排序的使用頻率顯著高于冒泡排序和選擇排序,主要有以下原因。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: