【知識框架】
ps:文末有驚喜
排序是按關鍵字的非遞減或非遞增順序對一組記錄重新進行排列的操作。
分類:(1)內部排序:待排序記錄全部存放在計算機記憶體中進行排序的過程;
(2)外部排序:待排序記錄的數量很大,記憶體一次不能容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程;
(1)插入類:直接插入排序、折半插入排序、希爾排序;
(2)交換類:氣泡排序、快速排序;
(3)選擇類:簡單選擇排序、樹形選擇排序、堆排序;
(4)歸併類:2-路歸併排序;
(5)分配類:基數排序;
(1)順序表:記錄之間的次序關係由其儲存位置決定,實現排序需要移動記錄;
(2)鍊錶:記錄之間的次序關係由其儲存位置決定,實現排序不需要移動記錄,僅需修改指標即可;
(3)位址排序:待排序記錄本身儲存在一組連續的儲存單元內,同時另設乙個指示各個記錄儲存位置的位址向量,在排序過程中不移動記錄本身,僅移動位址向量中這些記錄的位址,在排序結束之後再按照位址向量中的值調整記錄的儲存位置;
待排序記錄的資料型別定義:
#define maxsize 20
//順序表的最大長度
typedef
int keytype;
//定義關鍵字型別為整型
typedef
struct
redtype;
//記錄型別
typedef
struct
sqlist;
//順序表型別
(1)執行時間(時間複雜度)
高效的排序演算法的比較次數和移動次數應盡可能的少。
(2)輔助空間(空間複雜度)
理想的空間複雜度為o(1),即演算法執行期間所需要的輔助空間與待排序的資料量無關。
基本操作是將一條記錄插入到已經排好的有序表中,從而得到乙個新的、記錄數量增一的有序表。
void
insertsort
(sqlist &l)
}
【演算法特點】
(1)穩定排序;
(2)演算法簡便,且容易實現;
(3)也適用於鏈式儲存結構,只是在單鏈表上無需移動記錄,僅修改相應的指標;
(4)更適合初始記錄基本有序的情況;
void
binsertsort
(sqlist &l)
for(j = i -
1; j >= high +1;
--j)
l.r[high +1]
= l.r[0];}}
【演算法特點】
(1)穩定排序
(2)只能用於順序結構,不能用於鏈式結構(原因:要進行折半查詢);
(3)適合初始記錄無序、n較大時的形況;
void
shellinsert
(sqlist &l,
int dk)
l.r[j + dk]
= l.r[0]
;}}}
void
shellsort
(sqlist &l)
}
【演算法特點】
(1)記錄跳躍式地移動導致排序方法是不穩定的;
(2)只能用於順序結構,不能用於鏈式結構;
(3)增量序列可以有各種取法,但應該使增量序列中的值沒有除一之外的公因子,並且最後乙個增量值必須等於一;
(4)適合初始記錄無序、n較大時的情況;
void
bubblesort
(sqlist &l)
--m;}}
}
【演算法特點】
(1)穩定排序;
(2)可用於鏈式儲存結構;
(3)移動記錄次數較多,演算法平均時間效能比直接插入排序差。當初始記錄無序,n較大時,此演算法不宜採用;
【演算法特點】
(1)記錄非順次的移動導致排序的方法是不穩定的;
(2)排序過程中需要定位表的上界和下界,所以適合用於順序結構;
(3)適合初始記錄無序、n較大時的情況;
void
selectsort
(sqlist l)}}
}
【演算法特點】
(1)穩定排序演算法;
(2)可用於鏈式儲存結構;
(3)移動記錄次數較少,比直接插入排序快;
【演算法特點】
(1)不穩定排序;
(2)只能用於順序儲存結構,不能用於鏈式儲存結構;
(3)記錄較少時不宜採用。
【演算法特點】
(1)穩定排序;
(2)可用於鏈式儲存結構,且不需要附加儲存空間,但遞迴實現時仍需要開闢相應的遞迴工作棧;
附:直接插入排序、折半插入排序、希爾排序、氣泡排序、簡單選擇排序具體**(可直接拿來用)
#include
using
namespace std;
#define maxsize 20
typedef
int keytype;
//定義關鍵字型別為整型
typedef
int infotype;
typedef
struct
redtype;
//記錄型別
typedef
struct
sqlist;
//順序表型別
//直接插入排序
sqlist insertsort
(sqlist l)
}return l;
}//折半插入排序
sqlist binsertsort
(sqlist l)
for(j = i -
1; j >= high +1;
--j)
l.r[high +1]
= l.r[0]
;}return l;
}//希爾排序
sqlist shellinsert
(sqlist l,
int dk)
//可以理解為多次直接插入排序
l.r[j + dk]
= l.r[0]
;}}return l;
}sqlist shellsort
(sqlist l)
return l;
}//輸出排完之後的順序
void
putlist
(sqlist l)
}//氣泡排序
sqlist bubblesort
(sqlist l)
--m;}}
return l;
}//簡單選擇排序
sqlist selectsort
(sqlist l)}}
return l;
}int
main()
int a;
//選擇代號載體
cout <<
"*********請選擇以下幾種排序方式:**********"
<
cout <<
" 1:直接插入排序 "
<< endl;
cout <<
" 2:折半插入排序 "
<< endl;
cout <<
" 3:希爾排序 "
<< endl;
cout <<
" 4:氣泡排序 "
<< endl;
cout <<
" 5:簡單選擇排序 "
<< endl;
cout <<
"*******************************************"
<< endl;
cout <<
"請輸入(1/2/3/4/5):"
; cin >> a;
switch
(a)putlist
(l);
cout << endl;
}
期末複習 資料結構 排序(1)
1.排序 將一組 無序 的記錄序列調整為 有序 的記錄序列。2.內排序和外排序 概念 衡量效率的方法 排序方法 內部排序 插入排序 快速排序 選擇排序 歸併排序 基數排序等 外部排序 3.穩定排序和非穩定排序 穩定性概念 排序前兩個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。4...
資料結構期末複習
1 基於鄰接表 2struct vertexnode3 7struct edgenode8 12struct vertexnode adjlist 100 13 int visited 100 14 void gs int a,int n,int e 15 22for k 0 k e k 2330 ...
資料結構期末複習(一)
一.判斷題 字串是資料物件特定的線性表 t 乙個無向圖的連通分量是其極大的連通子圖 t 解析位址 假設b是一棵樹,b 是對應的二叉樹。則b的後根遍歷相當於b 的中序遍歷 t 通常,二叉樹的第i層上有2i 1個結點 f 對於一棵m階的b 樹,樹中每個結點至多有m 個關鍵字。除根之外的所有非終端結點至少...