將待排序的記錄ri,插入到已排好序的記錄表r1, r2 ,…., ri-1中,得到乙個新的、記錄數增加1的有序表。 直到所有的記錄都插入完為止。
設待排序的記錄順序存放在陣列r[1…n]中,在排序的某一時刻,將記錄序列分成兩部分:
◆ r[1…i-1]:已排好序的有序部分;
◆ r[i…n]:未排好序的無序部分。
顯然,在剛開始排序時,r[1]是已經排好序的。
2 演算法實現
void straight_insert_sort(sqlist *l)
int i, j ;
for (i=2; i<=l->length; i++)
l->r[0]=l->r[i]; j=i-1; /* 設定哨兵 */
while( lt(l->r[0].key, l->r[j].key) )
l->r[j+1]=l->r[j];
j--;
} /* 查詢插入位置 */
l->r[j+1]=l->r[0]; /* 插入到相應位置 */
3 演算法說明
演算法中的r[0]開始時並不存放任何待排序的記錄,引入的作用主要有兩個:
① 不需要增加輔助空間: 儲存當前待插入的記錄r[i],r[i]會因為記錄的後移而被占用;
② 保證查詢插入位置的內迴圈總可以在超出迴圈邊界之前找到乙個等於當前記錄的記錄,起「哨兵監視」作用,避免在內迴圈中每次都要判斷j是否越界。
4 演算法分析:複雜度為o(n2) 。
折半插入排序
當將待排序的記錄r[i] 插入到已排好序的記錄子表r[1…i-1]中時,由於r1, r2 ,…, ri-1已排好序,則查詢插入位置可以用「折半查詢」實現,則直接插入排序就變成為折半插入排序。
⑴ 演算法實現
void binary_insert_sort(sqlist *l)
int i, j, low, high, mid ;
for (i=2; i<=l->length; i++)
l->r[0]=l->r[i]; /* 設定哨兵 */
low=1 ;
high=i-1 ;
while (low<=high)
if ( lt(l->r[0].key, l->r[mid].key) )
high=mid-1 ;
else low=mid+1 ;
} /* 查詢插入位置 */
for (j=i-1; j>=high+1; j--)
l->r[j+1]=l->r[j];
l->r[high+1]=l->r[0]; /* 插入到相應位置 */
從時間上比較,折半插入排序僅僅減少了關鍵字的比較次數,卻沒有減少記錄的移動次數,故時間複雜度仍然為o(n2) 。
直接插入排序
直接插入排序是一種最簡單的排序方法,它的基本思想是依次將每個記錄插入到乙個有序中去。就是說,第i i 1 遍整理時,a1,a2,ai 1已經是排好序的子串行 取出第i個元素ai,在已排好序的子串行為ai找到乙個合適的位置,並將它插到該位置上。易知上述排序當i 1時實際上為空操作,故可直接從i 2開始...
直接插入排序
直接插入排序的演算法思想 直接插入排序 straight insertion sort 的基本操作是將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的 記錄數增 1 的有序表。根據該思想,編寫 如下 從已有序列的第0個記錄開始比較 public static void insertsort1 i...
直接插入排序
源文章url http student.zjzk.cn course ware data structure web paixu paixu8.2.1.1.htm 做過部分修改。1 基本思想 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直至...