DataStructure 排序 原始碼實現

2021-09-07 08:22:00 字數 3724 閱讀 4053

本篇部落格實現了 1.氣泡排序 2.氣泡排序的一種優化(當某次冒泡沒有進行交換時,退出迴圈) 3.選擇排序 4.歸併排序 5.快速排序。

主要是原始碼的實現,並將自己在敲的過程中所遇到的一些問題記錄下來。

#include #include #include using namespace std;

int num[100005]; //儲存陣列

void swap1(int i, int j) //交換函式swap

/*printnum 輸出*/

void printnum(int n) //輸出排序完成的陣列

cout << endl;

}

/*bubble_sort 氣泡排序*/

void bubble_sort(int n)}}

}

冒泡的思想:不斷把範圍中的最大數往後排,排完之後縮小範圍;以上過程執行n次。

個人小結:思想很簡單,但是太久不碰真的會忘記。

void bubble_sort_better(int n)

}if (flag) break; //某一次遍歷沒有發生交換時,結束

}}

優化的思想:當某一次冒泡沒有交換任何數時,則說明當前範圍內序列有序,結束迴圈。

/*selection_sort 選擇排序*/

void selection_sort(int n)

}swap1(i, rcd);

}}

思想:找出範圍i => n內最小的數,用rcd(初始化為i)記錄其位置,之後與尋找範圍內的第乙個數num[i]進行交換,保證i+1 => n的所有數均大於num[i]。

/*merge_sort 歸併排序*/

int temp[100005];

void merge_array(int l1, int r1, int l2, int r2)

if (p2 > r2)

if (num[p1] < num[p2])

else

}for (i = l1; i <= r2; i++)

}void merge_sort(int l, int r)

}

思想可以參考:白話經典演算法系列之五 歸併排序的實現

大概的思路是,先並後歸,將範圍二分,分別遞迴排序之後再進行合併(利用乙個額外的陣列temp)。

個人小結:

1.看似簡單,實現起來總是會出問題;動手吧。

2.一定要注意:遞迴選取的範圍,取了mid = (l+r)/2之後,左邊的一半範圍為[l => mid],右邊的一半範圍為[mid+1 => r]。原因可以考慮以下情況:兩個數3 1進行排序,mid = 1,如果選取的範圍為[l => mid-1]和mid => r,則會出現死迴圈。

int quick_sort_adjust(int l, int r)

}while (1)

}if (out_bound || a >= b) break; //如果出現越界或a>=b直接結束

swap1(a, b);

a++;

b--;

}swap1(key, a-1);

return a-1;

}void quick_sort(int l, int r)

}

思想可以參考:白話經典演算法系列之六 快速排序 快速搞定

思路上文講的很清楚了,建議在紙上模擬以下四種情況:

1.n = 7

1 3 1 2 -1 8 9

2.n = 7

1 1 1 1 1 1 1

3.n = 7

7 6 5 4 3 2 1

4.n = 7

7 1 1 1 1 1 1

個人小結:

1.同樣的,自己敲一遍能夠發現一堆問題。

2.一定要注意,當出現以下兩種情況時:(1)i>j(這裡的**是a>b) (2)i、j越界 應該立即退出迴圈。

3.遞迴範圍的選擇,在基準值num[key]和num[mid]交換之後,接下來的遞迴範圍應該為[l => mid-1]和[mid+1 => r],因為[l => mid-1]範圍內的所有值都小於num[mid],[mid+1 => r]內的所有值都大於num[mid];如果選取範圍對mid取等,會出現上文中兩個數(如 3 1)的死迴圈。

4.這裡選擇的基準是第乙個數,快速排序還有很多改進版本,如隨機選擇基準數,區間內資料較少時直接用別的方法排序以減小遞迴深度。

//

// main.cpp

// sort

//// created by wasdns on 16/12/25.

//#include #include #include using namespace std;

/*儲存陣列定義*/

int num[100005];

void swap1(int i, int j)

/*printnum 輸出*/

void printnum(int n)

cout << endl;

}/*bubble_sort 氣泡排序*/

void bubble_sort(int n)}}

}void bubble_sort_better(int n)

}if (flag) break; //某一次遍歷沒有發生交換時,結束

}}/*selection_sort 選擇排序*/

void selection_sort(int n)

}swap1(i, rcd);

}}/*merge_sort 歸併排序*/

int temp[100005];

void merge_array(int l1, int r1, int l2, int r2)

if (p2 > r2)

if (num[p1] < num[p2])

else

}for (i = l1; i <= r2; i++)

}void merge_sort(int l, int r)

}/*quick_sort 快速排序*/

int quick_sort_adjust(int l, int r)

}while (1)

}if (out_bound || a >= b) break; //如果出現越界或a>=b直接結束

swap1(a, b);

a++;

b--;

}swap1(key, a-1);

return a-1;

}void quick_sort(int l, int r)

}int main()

int option;

cin >> option;

if (option == 1)

else if (option == 2)

else if (option == 3)

else if (option == 4)

else if (option == 5)

printnum(n);

return 0;

}

2016/12/26

DataStructure 解釋二叉排序樹

兩組測試資料 include include define endkey 0 typedef int keytype typedef struct node bstnode,bstree void insertbst bstree t,keytype key 若在二叉排序樹中不存在關鍵字等於key的...

DataStructure 8 查詢技術

8.1概述 1 查詢方式分類 靜態查詢 不涉及插入 刪除操作的查詢 動態查詢 涉及插入 刪除操作的查詢 2 查詢結構 線性表 適用於靜態查詢,主要採用順序查詢技術,折半查詢技術.樹表 適用於動態查詢,主要採用二叉排序樹查詢技術.雜湊表 靜態查詢和動態查詢均適用,主要採用雜湊技術.3 查詢演算法的效能...

data structure 之棧與佇列

問題一 用兩個佇列實現乙個棧 思路 定義兩個佇列分別為q1,q2。呼叫棧的push操作時,直接將元素push到佇列q1中,時間複雜度為o 1 呼叫棧的pop操作時,先把q1中的q1.size 1個元素push到q2中,然後再pop出q1中的最後乙個元素,再把q2中的所有元素全部push到q1中,時間...