1 核心思想:插入排序通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入 ,如此重複,直至完成序列排序。2 演算法分析:
從序列第乙個元素開始,該元素可以認為已經被排序
取出下乙個元素,設為待插入元素,在已經排序的元素序列中從後向前掃瞄,如果該元素(已排序)大於?>待插入元素,將該元素移到下一位置。
重複步驟2,直到找到已排序的元素小於或者等於待排序元素的位置,插入元素
重複2,3步驟,完成排序。
1.預設序列第乙個元素12 以及被排序。
2.取下一元素 15 從後往前與已排序序列一次比較,15插入12 之後,已排序序列為[12,15]。
3.取下一元素9,重複2步驟,將9插12 之前,已排序序列為[9,12,15]。
4.迴圈上述操作,直至最後乙個元素24,插入合適位置,完成排序。
**實現1 時間複雜度:這個是插入到新的陣列裡面
// 直接插入排序(c++)
void insertsort(vector &vi)
else
}for(int j=i-1;j>left;j–) //vi[left,i-1]的元素整體後移
vi[left]=temp;}}
(1)順序排列時,只需比較(n-1)次,插入排序時間複雜度為o(n);****
(2)逆序排序時,需比較n(n-1)/2次,插入排序時間複雜度為o(n^2);
(3)當原始序列雜亂無序時,平均時間複雜度為o(n^2)。
(4)折半排序和直接插入排序的演算法複雜度都是o(n^2).
2 空間複雜度:
插入排序過程中,需要乙個臨時變數temp儲存待排序元素,因此空間複雜度為o(1)。
3 演算法穩定性:
插入排序是一種穩定的排序演算法。
## 補充:如果在同乙個線性表中應該如何進行直接插入排序,這裡就是會涉及到第乙個元素或者結構體可能會被覆蓋的問題,因此,可以用重置陣列將迴圈到的位置i所對應的結構體先儲存即可,排好序以後再插入這個元素或者結構體
//直接插入排序(按照姓名)void directinsertsort(sqlist &l)
strcpy(l.elem[j+1].name,name1);
strcpy(l.elem[j+1].number,number1);
l.elem[j+1].grade=grade1;}}
}
排序演算法 插入排序之直接插入排序
直接插入排序的核心思想是把乙個記錄插入乙個有序序列中,每插入乙個記錄就得到乙個新的有序序列,直到所有記錄都插入成功,得到有序序列。每次插入記錄時的有序序列如何得到,關鍵在第一次,第一次要插入的記錄時序列的第二個值,有序序列只有乙個值,就是第乙個記錄。a j 1 x j 1就是要插入的位置 print...
排序演算法之直接插入排序
直接插入排序 straight insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。設陣列為a 0 n 1 其中紅色區域為有序區域 1.初始時,a 0 自成1個有序區,無序區為a 1.n 1 a 0 a ...
排序演算法之直接插入排序
直接插入排序類似於我們平常在打撲克摸牌時候的一種情形。我習慣於左手拿牌右手摸牌,每次先把左手中的牌齊整齊,然後右手新摸一張牌中把它放到左手中正確的位置,讓它成為乙個新的整齊的牌堆。如果根據上面的思路我們可以發現,直接插入排序的思想就是,從需要排序的第二個數字開始,拿取乙個數,與前面的數字進行比較,放...