排序演算法分為外部排序和內部排序,插入排序屬於內部排序,內部排序即整個排序過程不需要訪問外存,僅在記憶體中就能完成,這類問題成為內部排序。
插入排序又分為兩種:直接插入排序,希爾排序。
將第乙個和第二個元素排好序,然後將第3個元素插入到已經排好序的元素中,一次類推(插入排序最好的情況就是陣列已經有序了)
直接插入排序的演算法思想:
將陣列中的所有元素依次從該元素所在位置往前和前面已經排好序的元素比較,如果選擇的元素比已排序的元素小,就交換兩個元素;如果大於等於前面的元素,則不變,直到全部的元素都比較過為止。因此,直接插入排序分為兩個迴圈:
外部迴圈遍歷所有未排序的元素;
內部迴圈將選中的元素與之前已經排好序的元素依次對比,如果小於則交換。
void
insertsort
(int a,
int num)
a[j +1]
= tmp;
//插入}}
}int
main()
;insertsort
(a,10);
for(
auto e : a)
cout << endl;
return0;
}
插入排序每次只能操作乙個元素,效率較低。所以有了希爾排序,希爾排序也稱遞減增量排序,是插入排序的一種更高效的方案,但是希爾排序是非穩定排序,所謂的穩定排序指,排序之後,兩個相等的元素還在自己原來的位置,比如陣列中有元素a,b。a=b,起初位置是a b 排完序之後還是a b而不是b a,非穩定排序指這兩個元素位置可能發生變化成b a。
希爾排序的演算法思想:
先將整個待排序序列分為若干個子串行,分別進行直接插入排序,待整個序列基本有序的時候,再對全體成員進行直接插入排序。
#include
using namespace std;
void
insertsort
(int a,
int num,
int k)}}
void
shellsort
(int a,
int num)
}int
main()
;shellsort
(a,10);
for(
auto e : a)
cout << endl;
return0;
}
排序演算法之插入排序
排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...
排序演算法之插入排序
排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...
排序演算法之插入排序
本節主要分析插入排序演算法的直接插入排序和希爾 shell 排序 又稱縮小增量排序 1.直接插入排序 該排序是最簡單的排序方法,其基本思想是 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直至i n為止,依次將r i 插入當前的有序區r 1....