正宗歸併排序演算法
阿新 • • 發佈:2020-07-31
正宗選擇排序演算法C++版本,看圖一目瞭然。
歸併排序和快速排序都用到了分治思想。這兩種排序演算法適合大規模的資料排序。
歸併排序的執行效率與要排序的陣列的有序程度無關,所以其時間複雜度是非常穩定的,不管最好、最壞、平均時間複雜度都是O(nlogn)。
空間複雜度是O(n)。
#include <iostream> #include <vector> #include <stack> #include <cstring> #include <string> #include <queue> #include <algorithm> #include "TreeNode.h" using namespace std; #define MAXSIZE 100000 // 合併 void Merge(int ans2[], int ans[], int start, int middle, int end){ int j, k ,s; // 以此從小到大放入陣列ans for(j = middle + 1, k = start; start <= middle && j <= end; k++){ if(ans2[start] < ans2[j]) ans[k] = ans2[start++]; else ans[k] = ans2[j++]; } // 如果左邊陣列還有剩 if(start <= middle) for(s = 0; s <= middle - start; s++) ans[k+s] = ans2[start + s]; // 如果右邊陣列還有剩 if(j <= end) for(s = 0; s <= end - j; s++) ans[k+s] = ans2[j + s]; } void MSort(int num[], int ans[], int start, int end){ int middle; if(start == end) ans[start] = num[start]; else{ int ans2[MAXSIZE + 1]; middle = (start + end)/2; MSort(num, ans2, start, middle); MSort(num, ans2, middle + 1, end); Merge(ans2, ans, start, middle, end); } } int main(int argc, char* argv[]){ int arr[8] = {8,7,6,5,4,3,2,1}; MSort(arr, arr, 0, 7); for(int i = 0; i < 8; i++){ cout<<arr[i]<<"\t"; } return 0; }