werwert

wetwet
 avatar
user_1349141
plain_text
2 years ago
2.1 kB
4
Indexable
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int Max = 1000;
void mergesort(vector<int>& nums, int s, int e);
void merge(vector<int>& nums, int s, int m, int e);


int main()
{
    int count=0;
    int a;
    vector<int> v1;
    while (cin >> a) {
        if (a == '#') {
            break;
        }
        v1.push_back(a);
    }
    mergesort(v1, 0, size(v1)-1);

    for (int& i : v1) {
        cout << i << " ";
    }
    cout << count << endl;
}

void mergesort(std::vector<int>& array, int front, int end) {
    if (end > front) {
        int mid = (front + end) / 2;       // mid即是將矩陣對半分的index
        mergesort(array, front, mid);      // 繼續divide矩陣的前半段subarray
        mergesort(array, mid + 1, end);    // 繼續divide矩陣的後半段subarray
        merge(array, front, mid, end);
    }
}

void merge(std::vector<int>& Array, int front, int mid, int end) {
    static int count;
    // 把array[front]~array[mid]放進 LeftSub[]
    // 把array[mid+1]~array[end]放進 RightSub[]
    std::vector<int> LeftSub(Array.begin() + front, Array.begin() + mid + 1),
                     RightSub(Array.begin() + mid + 1, Array.begin() + end + 1);

    LeftSub.insert(LeftSub.end(), Max);      // 在LeftSub[]尾端加入值為 Max 的元素
    RightSub.insert(RightSub.end(), Max);    // 在RightSub[]尾端加入值為 Max 的元素

    int idxLeft = 0, idxRight = 0;

    for (int i = front; i <= end; i++) {
        if (LeftSub[idxLeft] <= RightSub[idxRight]) {
            Array[i] = LeftSub[idxLeft];
            idxLeft++;
            if (LeftSub[idxLeft] != Max && RightSub[idxRight] != Max) {
                count += size(LeftSub)  - idxLeft;
                cout << count << endl;
            }
        }
        else {
            Array[i] = RightSub[idxRight];
            idxRight++;
        }
        for (int k : Array) {
            cout << k << " ";
        }
        cout << endl;
    }
}
//2 3 8 6 1#
Editor is loading...