第八周資料結構筆記

2022-07-18 16:39:44 字數 2295 閱讀 1583

排序的基本概念

(1)排序

有n個記錄的序列,其相應關鍵字的序列是,相應的下標序列為1, 2, .,n。 通過排序,要求找出當前下標序列1,2,....n 的一種排列

p1,p2, .,pn,使得相應關鍵字滿足如下的非遞減(或非遞增)關係,即: k1≤k2≤...≤kp,這樣就得到乙個按關鍵字有序的記錄序列: 。

(2)內部排序與外部排序

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

排序需要借助外部儲存裝置才能完成,成為外部排序。

(3)主關鍵字與次關鍵字

上面所說的關鍵字k可以是記錄r:的主關鍵字,也可以是次關鍵字,甚至可以是記錄中若干資料項的組合。若k;是主關鍵字,則任何乙個無序的記錄序列經排序後得到的有序序列是

惟一的;若k;是次關鍵字或是記錄中若干資料項的組合,得到的排序結果將是不惟一的,因為待排序記錄的序列中存在兩個或兩個以上關鍵字相等的記錄。

在排序過程中,一般進行兩種基本操作:

①比較兩個關鍵字的大小;

②將記錄從乙個位置移動到另乙個位置。

其中操作①對於大多數排序方法來說是必要的,而操作②則可以通過採用適當的儲存方

式予以避免。對於待排序的記錄序列,有三種常見的儲存表示方法。

●向量結構,即將待排序的記錄存放在一組位址連續的儲存單元中。由於這種儲存方式中,記錄之間的次序關係由其儲存位置來決定,所以排序過程中一定要移動記錄才行。

●鍊錶結構。採用鍊錶結構時,記錄之間邏輯上的相鄰性是靠指標來維持的,這樣在排序時,就不用移動記錄元素,而只需要修改指標。這種排序方式被稱為鍊錶排序。

●記錄向量與位址向量結合,即將待排序記錄存放在一組位址連續的儲存單元中,同時另設乙個指示各個記錄位置的位址向量。這樣在排序過程中不移動記錄本身,而修改位址

向量中記錄的位址, 排序結束後再按照位址向量中的值調整記錄的儲存位置。這種排序方式被稱為位址排序。

**定義:typedef int keytype;

typedef struct recordtype;

(1)直接插入排序

直接插入排序是一種最基本的插入排序方法,其基本操作是將第i個記錄插入到前面i-1個已排好序的記錄中。

**:void

inssort(recordtype r, int length)

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

for( i=2; i<=length; i++)

r[0]=r[i]; j=i-1;

/*將待插入記錄存放到監視哨r[0]中*/

while (r[0].key< rj.key) /* 尋找插入位置*/

r[j+1]=r[j]; j=j-1;

r[j+1]=r[0];

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

}/* inssort */

(2)折半插入排序

從關於查詢的討論中可知,對於有序表進行折半查詢,其效能優於順序查詢。所以,可以將折半查詢用於在有序記錄r[..i-1]中確定 應插入位置,相應的排序法稱為折半插入排序法。

**:void  binsort (recordtype r, int length)

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

for( i=2 ; i<=length; ++i)

/* binsort*/

(3)希爾排序

在待排序的關鍵字序列基本有序且關鍵字個數n較少時,其演算法的效能最佳。希爾排序又稱縮小增量排序法,是一種基於插入思想的排序方法。

void  shlllnsert(recordtype r, int length, int delta)

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

for(i=1+delta ; i<= length; i++)

/*1+delta為第乙個子串行的第二二個元素的下標*/

if([ij.key < r[i-delta].key)

/*shellnsert*/

void

shellsort(recordtype r, int length, int delta, int n)

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

for(i=0; i<=n-1; ++i)

shelllnsert(r, length, delta[i]);

}

第八周 資料結構 自建演算法庫之鏈串

writer 羅海員 date 2015年11月02日 版本 v1.0.1 作業系統 xp 執行環境 gcc 問題描述 定義鏈串的儲存結構,實現其基本運算,並完成測試。輸入描述 演算法庫包括兩個檔案 程式輸出 ifndef listring h included define listring h ...

第八周 資料結構實踐專案二 建設鏈串演算法庫

我採用了多檔案系統的方式將演算法庫分為標頭檔案 原始檔以及測試函式三部分。標頭檔案 all righs reserved 檔名稱 listring.h 完成日期 2015年10月20日 問題描述 建設鏈串演算法庫 程式說明 標頭檔案 ifndef listring h included define...

《結構 C 第八周》

對任務及求解方法的描述部分 問題描述 結構是一種對資料及功能進行封裝的資料結構,是比類更簡單的物件。結構也可以實現介面。程式頭部的注釋結束 using system using system.collections.generic using system.linq using system.tex...