werwert
wetwetuser_1349141
plain_text
3 years ago
2.1 kB
5
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...