werwert
wetwetuser_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...