1. 程式人生 > 資訊 >特斯拉與巴西淡水河谷公司簽署祕密鎳供應協議

特斯拉與巴西淡水河谷公司簽署祕密鎳供應協議

#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, int
n) { 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; }