理论基础 —— 排序 —— 直接插入排序
【概述】
直接插入排序是一種穩定的排序方法,其是插入排序中最簡單的排序方法,類似于玩撲克時整理手牌的過程。
其基本思想是:依次將待排序序列中的每一記錄插入到一個已排好序的序列中,直到全部記錄都排好序。
其實現依靠雙重循環完成,外層循環執行 n-1 次,內層循環執行次數取決于第 i 個記錄前有多少個記錄的關鍵碼大于第 i 個記錄的關鍵碼。
【排序過程】
1.排序過程
具體的排序過程為:
2.實例
初始關鍵字: ?『?6,5,3,1,8,7,2,4?』
第一趟排序: 『?6?』,5,3,1,8,7,2,4?
第二趟排序: 6,5,3,1,8,7,2,4
? ? ? ? ? ? ? ? ? ? ? 『?6,5?』,3,1,8,7,2,4
第三趟排序: 5,6,3,1,8,7,2,4
?? ? ? ? ? ? ? ? ? ? ? 5,『6,3』,1,8,7,2,4
?? ? ? ? ? ? ? ? ? ? ? 『5,3』,6,1,8,7,2,4
第四趟排序: 3,5,6,1,8,7,2,4
?? ? ? ? ? ? ? ? ? ? ? 3,『5,1』,6,8,7,2,4
?? ? ? ? ? ? ? ? ? ? ?『?3,1』,5?,6,8,7,2,4
第五趟排序:?1,3,5?,6,8,7,2,4
?? ? ? ? ? ? ? ? ? ? ? 1,3,5,『6,8』,7,2,4?
第六趟排序:?1,3,5?,6?,8,7,2,4
?? ? ? ? ? ? ? ? ? ? ??1,3,5,6,『8,7』,2,4?
?? ? ? ? ? ? ? ? ? ? ??1,3,5,『6,7』,8,2,4?
第七趟排序:?1,3,5?,6?,7,8,2,4
?? ? ? ? ? ? ? ? ? ? ??1,3,5,6,7,『8,2』,4
?? ? ? ? ? ? ? ? ? ? ??1,3,5,6,『7,2』,8,4
?? ? ? ? ? ? ? ? ? ? ??1,3,5,『6,2』,7,8,4
?? ? ? ? ? ? ? ? ? ? ??1,3,『5,2』,6,7,8,4
?? ? ? ? ? ? ? ? ? ? ??1,『3,2』,5,6,7,8,4
?? ? ? ? ? ? ? ? ? ? ??『1,2』,3,5,6,7,8,4
第八趟排序:?1,2,3,5,6,7,8,4
?? ? ? ? ? ? ? ? ? ? ??1,2,3,5,6,7,『8,4?』
?? ? ? ? ? ? ? ? ? ? ??1,2,3,5,6,『7,4』,8
?? ? ? ? ? ? ? ? ? ? ??1,2,3,5,『6,4』,7,8
?? ? ? ? ? ? ? ? ? ? ??1,2,3,『5,4』,6,7,8
?? ? ? ? ? ? ? ? ? ? ??1,2,『3,4』,5,6,7,8
?結果: ? ? ???『??1,2,3,4,5,6,7,8 ?』
?? ????????
? ? ? ? ? ? ? ? ? ?排序過程?????????????????????????????????????????????????????????宏觀過程
【時空復雜度分析】
在最好的情況下,待排序序列為正序,每趟排序只需與有序序列的最后一個記錄的關鍵碼比較一次,移動兩次記錄,那么總的比較次數為 n-1,總的移動次數為 2(n-1),因此,最優時間復雜度為 (n)
在最壞的情況下,待排序序列為逆序,第 i 趟插入時,第 i 個記錄必須與前面的 i-1 個記錄的關鍵碼與哨兵比較,并且每比較一次就要做一次記錄的移動,那么總的比較次數為 (n+2)(n-1)/2,總的移動次數為 (n+4)(n-1)/2,因此,最壞時間復雜度為 O(n^2)
在平均情況下,待排序序列中各種可能排列的概率情況相同,在插入第 i 個記錄時平均要比較有序區中全部記錄的一半,那么總的比較次數為 (n+2)(n-1)/4,總的移動次數為 (n+4)(n-1)/4,因此,平均時間復雜度為 O(n^2)
直接插入排序只需要一個記錄的輔助空間,用于作為待插入記錄的暫存單元和查找記錄的插入位置過程中的哨兵。?
【源程序】
void insertSort(int a[],int n){for(int i=2;i<=n;i++){int temp=a[i];//暫存待插入關鍵碼,并設置哨兵int j=i-1;while(temp<a[j]&&j>=1){//尋找插入位置a[j+1]=a[j];//記錄后移j--;}if(j!=i-1)//防止自我插入a[j+1]=temp;} }總結
以上是生活随笔為你收集整理的理论基础 —— 排序 —— 直接插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像模糊处理(信息学奥赛一本通-T112
- 下一篇: 信息学奥赛C++语言:某年某月天数