PTA 乙級 1035 插入與歸併 (25分) C++
阿新 • • 發佈:2020-07-24
插入排序:https://blog.csdn.net/qq_42453117/article/details/99680831
歸併排序:https://blog.csdn.net/qq_42453117/article/details/100036347
測試點0、2、4:插入排序
測試點1、3、5、6:歸併排序
C++
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 5 using namespace std; 6 7 // 插入排序 8 int insertionsort(vector<int> a, vector<int> b, int n) { 9 int flag = 0; 10 for (int i = 1; i < n; i++) { // 從arr[0]後的元素開始 11 int value = a[i]; // 定義待插入的數 12 int index = i; // 找到待插入數的下標 13 while (index > 0 && value < a[index - 1]) { // 元素右移 14 a[index] = a[index - 1]; 15 index--; 16 } 17 a[index] = value; // 找到傳入元素所在位置賦值 18 if (flag) { // 輸出該排序演算法再迭代一輪的序列 19 cout << "Insertion Sort" << endl; 20 cout << a[0]; 21 for(int j = 1; j < n; j++)cout << " " << a[j]; 22 return 1; 23 } 24 if (equal(a.begin(), a.end(), b.begin())) // 與第二行資料進行比較 25 flag = 1; 26 } 27 return 0; 28 } 29 30 // 歸併排序 31 void mergesort(vector<int> a, vector<int> b,int n) { 32 int k = 1; // 分割大小 33 int flag = 0; 34 while (k <= n ) { // 當分割的大小小於陣列大小時 35 for (int i = 0; i < n; i += k) { 36 sort(a.begin() + i, a.begin() + (i + k < n ? i + k : n)); // 將分割的陣列進行排序 37 } 38 k *= 2; //分割大小以二倍增大 39 if (flag) { 40 cout << "Merge Sort" << endl; 41 cout << a[0]; 42 for (int j = 1; j < n; j++)cout << " " << a[j]; 43 return; 44 } 45 if (equal(a.begin(), a.end(), b.begin())) 46 flag = 1; 47 } 48 } 49 50 int main() { 51 int n = 0; 52 cin >> n; 53 vector<int> arr(n); 54 vector<int> asort(n); 55 for (int i = 0; i < n; i++) cin >> arr[i]; 56 for (int i = 0; i < n; i++) cin >> asort[i]; 57 if (insertionsort(arr, asort, n)) exit(0); //是插入排序直接退出 58 mergesort(arr, asort, n); 59 return 0; 60 }