將乙個數插入到一組已經排好序的序列中,保持插入後序列排序關係不變,這就是插入排序。
將乙個陣列分為兩個部分,前一部分為已排序,後一部分為亂序,每次將亂序部分第乙個元素插入到有序部分中,從插入點開始有序部分元素依次後移,如此重複直至亂序元素個數為0,則完成整個排序過程。
/*插入排序演算法*/
void insertsort(int* arr, int len)
arr[pos + 1] = temp;
}}
插入排序演算法時間複雜度為o(n^2),空間複雜度為o(1).
插入排序需要反覆查詢新插入點位置並且移動元素,不適合對於資料量比較大的排序應用,如果小規模資料需要排序並且初始資料幾乎是有序的,插入排序是乙個不錯的選擇。
插入排序過程需要反覆在已排序序列中找新插入元素位置,若已排序序列長度較大,可以利用二分查詢加快查詢速度,減少元素比較次數從而提高效率。
// 二分查詢插入點位置
// arr : 待排序陣列
// n : 新插入的元素的位置
// 返回有序部分中新插入點位置
int getinsertindex(int arr, int n) else if (arr[mid] > temp) else
} return first;
}
希爾排序是一種遞減增量分組插入排序,基於插入排序的以下兩點性質而提出改進方法的:
希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能,這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長(最終步長為1)進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好。
// shell排序演算法
void shellsort(int arr, int n)
arr[j + step] = temp;
} }}
步長的選擇是希爾排序的重要部分,只要最終步長為1任何步長序列都可以工作。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。
已知的最好步長序列是由sedgewick提出的 (1, 5, 19, 41, 109,...),該序列的項來自 9 * 4^i - 9 * 2^i + 1 和 4^i - 3 * 2^i + 1 這兩個算式。研究表明比較在希爾排序中是最主要的操作,而不是交換。用這樣步長序列的希爾排序比插入排序和堆排序都要快,甚至在小陣列中比快速排序還快,但是在涉及大量資料時希爾排序還是比快速排序慢。
排序演算法之插入排序
排序演算法之插入排序 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....