特斯拉與巴西淡水河谷公司簽署祕密鎳供應協議
阿新 • • 發佈:2022-03-31
#include <iostream> using namespace std; void MergeSort(int a[], int n); void MergePass(int a[], int length, int n); void Merge(int a[], int min, int mid, int max); int main() { int a[10]; for (int i = 0; i < 10; i++) cin >> a[i]; MergeSort(a, 10); for (int i = 0; i < 10; i++) cout << a[i] << " "; return 0; } /*此函式實現二路歸併排序*/ void MergeSort(int a[], int n) // n是陣列長度 { int length = 1; // length是子序列的長度 for (length = 1; length < n; length *= 2) MergePass(a, length, n); } /*此函式實現一趟子序列長度為length的二路歸併排序*/ void MergePass(int a[], int length, intn) { int i = 0; for (i = 0; i + 2 * length - 1 < n; i += 2 * length) //對相鄰的長度為length的子序列歸併 Merge(a, i, i + length - 1, i + 2 * length - 1); /*上方這個迴圈結束有2種情況: 第一種:剩下的所有元素是一個序列,那就不用處理了 第二種:剩下的元素在2個序列裡,前一個序列長度為length,後面的長度長度比length短*/ if (i + length < n) //第二種情況,把這2個子序列歸併了{ Merge(a, i, i + length - 1, n - 1); } } /*此函式實現合併2個相鄰子序列*/ void Merge(int a[], int min, int mid, int max) { int *temp = new int[max - min + 1]; int i = min, j = mid + 1, k = 0; // i和j分別是2個子序列的下標,k是temp的下標 while (i <= mid && j <= max) //當2個子表都沒有掃描完的時候 { if (a[i] <= a[j]) { temp[k] = a[i]; i++; k++; } else { temp[k] = a[j]; j++; k++; } } while (i <= mid) { temp[k] = a[i]; i++; k++; } while (j <= max) { temp[k] = a[j]; j++; k++; } for (i = min, k = 0; i <= max; i++, k++) //把temp數組裡的值複製回陣列a[] { a[i] = temp[k]; } delete[] temp; }