排序演算法(七)表插入排序

2021-06-27 06:28:29 字數 2393 閱讀 9438

1、前面文章介紹的插入排序不可避免地要移動記錄,而表插入排序則不需要移動記錄。

2、待排序資料的常用儲存方式有:

(1)以順序表作為儲存結構:對記錄本身進行物理重排,即通過關鍵字之間的比較判定,將記錄移到合適的位置;

(2)以鍊錶作為儲存結構:無需移動記錄,僅需修改指標。通常將這類排序稱為鍊錶(或鏈式)排序;

(3)用順序的方式儲存待排序的記錄,但同時建立乙個輔助表(如包括關鍵字和指向記錄位置的指標組成的索引表)

只需對輔助表進行物理重排,即只移動輔助表的表目,而不移動記錄本身。適用於難於在鍊錶上實現,仍需避免排序

過程中移動記錄的排序方法。表插入排序即屬於這種情況。

3、表插入排序的過程可以描述為將儲存結構由順序結構改為鏈式結構,再進行插入排序,鏈式結構在插入時無需移

動記錄,只需修改指標值。和直接插入排序演算法相比較,表插入排序中比較的關鍵字次數不變,只是需要n個輔助空

間來存放每個資料的指標值。由此推知的時間複雜度為o(n2)。也就是說,表插入排序演算法是通過減少"移動"次數來對

直接插入排序的改進。

4、下面提供兩種**示例:

typedefstruct

recnode;// 表結點的型別

typedefstruct

slinklist;// 靜態鍊錶的型別

(2)實現一:

voidtableinsertsort1(slinklist* l)

j = l->r[i].next;// 取下一條記錄

l->r[i].next = p;// 將當前記錄插入到靜態鍊錶

l->r[head].next = i;

i = j;

}

}

(3)實現二:

voidtableinsertsort2(slinklist *l)

// 插入的值是最大值

if(p == 0)

else

}

5、注意:表插入排序的結果只是求得乙個有序的鍊錶,因此只能對其進行順序查詢,而不能進行隨機查詢,為了實現有序表的折半查詢,還需對記錄進行重新排列。

6、給出乙個呼叫示例:

int_tmain(intargc, _tchar* argv)

l.r[l.length].next = 0;// 末結點的指標域置為0以作為結束標記

intp = l.r[0].next;

while(p!=0)

// 排序

tableinsertsort1(&l);

p = l.r[0].next;

while(p!=0)

getchar();

return0;

}

插入排序(二) 表插入排序

上篇文章已經提到直接插入排序中,時間消耗在了元素間的比較次數和移動這兩方面。折半插入排序可以減小比較次數,而表插入排序則可以避免元素移動。但它需要建立資料結構,並且需要額外的空間 省時一般都耗空間,這個在演算法上很常見哦!首先給出表結構,定義如下 define size 100 typedef st...

排序演算法 插入排序

插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃瞄過程中,需要反覆把已排...

排序演算法 插入排序

排序演算法之插入排序 參照新版程式 下面是錯誤的理解,正確的參考,後文已經修改過的部分。選擇排序,顧名思義,就是選擇乙個元素進行排序。原理 將原始序列分成兩部分,一部分已經有序,一部分無序。將無序中的元素逐個插入到有序序列中。這個也是兩層迴圈,就我個人理解,與氣泡排序是乙個原理。氣泡排序是每次都從無...