排序演算法分析(直插,折半,希爾)

2021-10-05 19:16:52 字數 2656 閱讀 1339

一.排序分類

根據排序時資料所占用儲存器的不同,可將排序分為兩類。一類是整個排序過程完全在記憶體中進行,稱為內部排序;另一類時由於待排序資料量太大,記憶體無法容納全部資料,排序需要借助外部儲存裝置才能完成,成為外部排序。

二.插入類排序

插入排序的基本思想:在乙個已排好序的記錄子集的基礎上,每一步將下乙個待排序的記錄有序插入到已排好序的記錄子集中,直到將所有待排記錄全部插入為止。

2.1直接插入排序例:待排排序序列為完整的直接插入排序過程實現例項,大括號為當前已排好序的記錄子集合

a)62 35 77 55 14 35 98

b)35 77 55 14 35 98

c)77 55 14 35 98

d)55 14 35 98

e)14 35 98

f)98

g)98

h)

假設待排序記錄存放在r[1…length]中,為了提高效率設乙個監視哨r[0],使得r[0]始終存放待插入的記錄。監視哨的兩個作用:①備份待插入的記錄,方便前面關鍵字較大的記錄後移;②防止越界

演算法實現

void

inssort

(recordtype r,

int length)

//對記錄陣列r做直接插入排序,length為陣列中待排序記錄的數目

r[j+1]

=r[0];

//將待插入記錄插入到已排序的序列中

}}

演算法要點:①設定監視哨r[0]臨時儲存待插入的記錄②從後往前查詢應插入的位置③查詢與移動用同一迴圈完成

演算法分析:①時間複雜度o(n²)②最好情況o(n),n較小或元素基本有序③最壞情況o(n²)④空間複雜度o(1)⑤穩定 **while(r[0].key2.2折半插入排序

對於有序表進行折半查詢,效能優於順序查詢,可以將折半查詢思想用於在有序記錄r[1…i-1]中確定插入位置

演算法實現:

void

binsort

(recordtype r,

int length)

//對記錄陣列r進行折半插入排序,length為陣列的長度

for(j=i-

1;j>=low;

--j) r[j+1]

=r[j]

;//記錄依次向後移動

r[low]

=x;//插入記錄

}}

演算法要點:折半插入排序可以減少關鍵字的比較次數,每插入乙個元素,需要比較的次數最大為折半判定樹的深度演算法分析:①時間複雜度為o(n²),比較時間複雜度為o(nlogn)②最好情況o(nlogn)③最壞情況o(n²)④空間複雜度o(1)

2.3希爾排序

希爾排序又稱縮小增量排序法,基於插入思想,擁有直接插入的最佳性質

例:待排序列為給出執行希爾排序演算法執行的過程

演算法實現:

void

shellinsert

(recordtype r,

int length,

int delta)

//對記錄陣列r做一趟希爾插入排序,length為陣列的長度,delta為增量

}void

shellsort

(recordtype r,

int length,

int delta,

int n)

//對記錄陣列r做希爾排序,length為陣列r的長度,delta為增量陣列,n為delta的長度

演算法要點:當子串行的間隔為d時共有d個子序列,需對d個子序列分別進行插入排序,但是演算法在具體實現時,不是先對乙個子串行完成插排,再對另乙個子串行插排,而是從第乙個子串行的第二個記錄開始,掃瞄整個待排序記錄序列,當前記錄屬於哪乙個子串行,就在哪乙個子串行進行插排,所以演算法會在每乙個子串行中輪流進行插入排序

演算法分析:①時間複雜度o(n 1.5),空間複雜度o(1) ②不穩定 eg:

演算法導論 演算法分析 希爾排序 003

希爾排序是1959 年由d.l.shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序 基本思想 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。演算法流程 1 選擇乙個增量序列t1,t2,tk,其...

DS內排 直插排序

題目問題 e ds內排 直插排序 時間限制 1 sec 記憶體限制 128 mb 提交 208 解決 185 提交 狀態 討論版 題目描述 給定一組資料,使用直插排序完成資料的公升序排序。程式要求 若使用c 只能include乙個標頭檔案iostream 若使用c語言只能include乙個標頭檔案s...

DS內排 直插排序

題目描述給定一組資料,使用直插排序完成資料的公升序排序。程式要求 若使用c 只能include乙個標頭檔案iostream 若使用c語言只能include乙個標頭檔案stdio 程式中若include多過乙個標頭檔案,不看 作0分處理 不允許使用第三方物件或函式實現本題的要求 輸入 資料個數n,n個...