【筆記】內部排序演算法
一、排序的基本概念
排序:把一個無序的元素序列按照元素的關鍵字遞增或遞減排列為有序的序列。
假設包含n個元素(記錄)的的序列
(E_1,E_2,….,E_n)
對應的關鍵字為(k_1,k_2,…,k_n)
,需確定1,2,…,n的一種排列p_1,p_2,…,p_n
,使關鍵字滿足非遞減(或非遞增)關係k_{p1} \leq k_{p2}\leq …\leq k_{pn}
,從而使元素構成一個非遞減(或非遞增)的序列(E_{p1},E_{p2},….,E_{pn})
,這個的一種操作被稱為排序。 穩定排序和不穩定排序:在待排序的記錄序列中,若存在兩個或兩個以上關鍵字相等的記錄。假設
k_i=k_j(1\leq i\leq n,1\leq j\leq n,i \neq j)
,且排序前對應的記錄E_i
(即i<j
)。在排序之後,如果元素E_i
仍領先於E_j
,則稱這種排序採用的方法是穩定的。如果經過排序之後元素E_j
領先於E_i
,則稱這種排序方法是不穩定的。 內排序和外排序:由於待排序的記錄數量不同,使得排序過程中涉及的儲存器不同,可將排序方法分為內部排序和外部排序兩類。內部排序也稱內排序,指的是待排序記錄存在在計算機隨機儲存器中進行的排序過程;瓦布排序也稱為外排序,指的是是待排序記錄的資料量很大,一致記憶體不能容納全部記錄,在排序的過程中需要不斷對外存進行訪問的排序過程。
一個排序演算法的好壞主要可以通過時間複雜度、空間複雜度和穩定性來衡量。無論演算法穩定還是不穩定,都不會影響到排序的最終結果。通常只考慮比較關鍵字的次數和移動記錄的次數。當關鍵字是字串時,比較關鍵字要佔用較多的時間,是影響時間複雜性的主要因素。而當記錄很大時,為了交換記錄的位置,移動記錄成為影響時間複雜性的主要因素。
在排序過程中需要一下兩種基本操作:
- 比較兩個元素相應關鍵字的大小。
- 將元素從一個位置移動到另一個位置。
第一種操作對大多數排序演算法來說是必要的,第二中操作可通過改變記錄的儲存方式避免。
待排序的記錄序列可由下列3中儲存方式:
- 順序儲存:待排序的元素儲存在一組連續的儲存單元中,這類似於線性表的順序儲存,在序列中相鄰的兩個記錄
Ei E_i和Ej E_j,它們的物理位置也相鄰。在這種儲存方式中,記錄之間的次序關係由其儲存位置決定,則實現排序必須移動記錄。- 鏈式儲存:待排序的元素儲存在一組不連續的儲存單元中,這類似於線性表的鏈式儲存,序列中相鄰的兩個記錄
Ei E_i和Ej E_j,它們的物理位置不一定相鄰。在這種儲存方式中,不需要移動元素,只需要修改指標即可。- 靜態連結串列:待排序記錄存放在靜態連結串列中,記錄之間的關係由被稱為遊標的指標指示,實現排序不需要移動元素,只需要修改遊標即可。
為了演算法實現方便, 本文的排序演算法主要採用順序儲存,相應的元素型別描述如下:
#define MaxSize 100
typedef int KeyType;
typedef struct /*資料元素型別定義*/
{
KeyType key;/*關鍵字*/
}DataType;
typedef struct /*順序表型別定義*/
{
DataType data[MaxSize];
int length;
}SqList;
二、插入排序
1.直接插入排序
詳情請點選檢視直接插入排序
2.折半插入排序
詳情請點選檢視折半插入排序
3.2-路插入排序
詳情請點選檢視2-路插入排序
4.表插入排序
詳情請點選檢視表插入排序
5.希爾排序
詳情請點選檢視希爾排序
三、交換排序
1.氣泡排序
詳情請點選檢視氣泡排序
2.快速排序
詳情請點選檢視快速排序
四、選擇排序
1.簡單選擇排序
詳情請點選檢視簡單選擇排序
2.樹形選擇排序
詳情請點選檢視樹形選擇排序
3.堆排序
詳情請點選檢視堆排序
五、歸併排序
詳情請點選檢視歸併排序
六、基數排序
詳情請點選檢視基數排序
七、各種內部排序演算法的比較
相關文章
- STL的內觀排序(introsort)演算法學習筆記 (轉)排序ROS演算法筆記
- 【演算法】演算法圖解筆記_快速排序演算法圖解筆記排序
- 《演算法筆記》5. 字首樹、桶排序、排序演算法總結演算法筆記排序
- 【資料結構與演算法】內部排序總結(附各種排序演算法原始碼)資料結構演算法排序原始碼
- Javascript常見排序演算法的筆記JavaScript排序演算法筆記
- MySQL排序內部原理探祕MySql排序
- 【資料結構與演算法】內部排序之三:堆排序(含完整原始碼)資料結構演算法排序原始碼
- SQL學習筆記(ORACLE內部儲存)SQL筆記Oracle
- 用 Java 實現常見的 8 種內部排序演算法Java排序演算法
- C++筆記 劃分與排序演算法C++筆記排序演算法
- 【資料結構與演算法】內部排序之五:計數排序、基數排序和桶排序(含完整原始碼)資料結構演算法排序原始碼
- 內部排序分類及穩定性排序
- 《Java程式設計思想》筆記07——內部類Java程式設計筆記
- 【筆記】希爾排序筆記排序
- 【筆記】快速排序筆記排序
- 【筆記】堆排序筆記排序
- Symfony2 學習筆記之內部構件筆記
- C#學習筆記一:深入HelloWorld內部 (轉)C#筆記
- 按照NSArray內部的某個物件排序物件排序
- 氣泡排序筆記排序筆記
- 【筆記】氣泡排序筆記排序
- 【筆記】歸併排序筆記排序
- 【筆記】基數排序筆記排序
- 筆記:拓撲排序筆記排序
- 排序演算法速記排序演算法
- hive學習筆記之三:內部表和外部表Hive筆記
- Struts2筆記09 值棧的內部結構筆記
- Java程式設計思想學習筆記1 - 內部類Java程式設計筆記
- 【資料結構與演算法】內部排序之二:氣泡排序和選擇排序(改進優化,附完整原始碼)資料結構演算法排序優化原始碼
- 【安卓筆記】作為內部類的廣播接收者安卓筆記
- 【筆記】折半插入排序筆記排序
- 【筆記】表插入排序筆記排序
- 【筆記/模板】拓撲排序筆記排序
- 《演算法筆記》3. 歸併排序、隨機快排整理演算法筆記排序隨機
- 《演算法筆記一》複雜度、排序、二分、異或演算法筆記複雜度排序
- 學習筆記--- 比較排序之堆排序筆記排序
- Android筆記之Kotlin、Java的內部類?巢狀類?Android筆記KotlinJava巢狀
- 《演算法筆記》4. 堆與堆排序、比較器詳解演算法筆記排序