1、前面文章介紹的插入排序不可避免地要移動記錄,而表插入排序則不需要移動記錄。
2、待排序資料的常用儲存方式有:
(1)以順序表作為儲存結構:對記錄本身進行物理重排,即通過關鍵字之間的比較判定,將記錄移到合適的位置;
(2)以鍊錶作為儲存結構:無需移動記錄,僅需修改指標。通常將這類排序稱為鍊錶(或鏈式)排序;
(3)用順序的方式儲存待排序的記錄,但同時建立乙個輔助表(如包括關鍵字和指向記錄位置的指標組成的索引表)
只需對輔助表進行物理重排,即只移動輔助表的表目,而不移動記錄本身。適用於難於在鍊錶上實現,仍需避免排序
過程中移動記錄的排序方法。表插入排序即屬於這種情況。
3、表插入排序的過程可以描述為將儲存結構由順序結構改為鏈式結構,再進行插入排序,鏈式結構在插入時無需移
動記錄,只需修改指標值。和直接插入排序演算法相比較,表插入排序中比較的關鍵字次數不變,只是需要n個輔助空
間來存放每個資料的指標值。由此推知的時間複雜度為o(n2)。也就是說,表插入排序演算法是通過減少"移動"次數來對
直接插入排序的改進。
4、下面提供兩種**示例:
typedef
struct
recnode;
// 表結點的型別
typedef
struct
slinklist;
// 靜態鍊錶的型別
(2)實現一:
void
tableinsertsort1(slinklist* l)
j = l->r[i].next;
// 取下一條記錄
l->r[i].next = p;
// 將當前記錄插入到靜態鍊錶
l->r[head].next = i;
i = j;
}
}
(3)實現二:
void
tableinsertsort2(slinklist *l)
// 插入的值是最大值
if
(p == 0)
else
}
5、注意:表插入排序的結果只是求得乙個有序的鍊錶,因此只能對其進行順序查詢,而不能進行隨機查詢,為了實現有序表的折半查詢,還需對記錄進行重新排列。
6、給出乙個呼叫示例:
int
_tmain(
int
argc, _tchar* argv)
l.r[l.length].next = 0;
// 末結點的指標域置為0以作為結束標記
int
p = l.r[0].next;
while
(p!=0)
// 排序
tableinsertsort1(&l);
p = l.r[0].next;
while
(p!=0)
getchar
();
return
0;
}
插入排序(二) 表插入排序
上篇文章已經提到直接插入排序中,時間消耗在了元素間的比較次數和移動這兩方面。折半插入排序可以減小比較次數,而表插入排序則可以避免元素移動。但它需要建立資料結構,並且需要額外的空間 省時一般都耗空間,這個在演算法上很常見哦!首先給出表結構,定義如下 define size 100 typedef st...
排序演算法 插入排序
插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃瞄過程中,需要反覆把已排...
排序演算法 插入排序
排序演算法之插入排序 參照新版程式 下面是錯誤的理解,正確的參考,後文已經修改過的部分。選擇排序,顧名思義,就是選擇乙個元素進行排序。原理 將原始序列分成兩部分,一部分已經有序,一部分無序。將無序中的元素逐個插入到有序序列中。這個也是兩層迴圈,就我個人理解,與氣泡排序是乙個原理。氣泡排序是每次都從無...