本篇部落格實現了 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中,時間...