排序的基本概念
(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...