#include <iostream>
#include <stdlib.h>
using namespace std;
//[left_idx, mid_idx], (mid_idx, right_idx]
//mid_idx = left_idx + (right_idx - left_idx) / 2
void merge(int* arr, int left_idx, int right_idx){
if(left_idx >= right_idx){
return;
}
int *new_arr = new int[right_idx - left_idx + 1];
int mid_idx = left_idx + (right_idx - left_idx) / 2;
int idx_1 = left_idx;
int idx_2 = mid_idx+1;
int i = 0;
while(idx_1 <= mid_idx && idx_2 <= right_idx){
new_arr[i++] = arr[idx_1] <= arr[idx_2] ? arr[idx_1++] : arr[idx_2++];
}
while(idx_1 <= mid_idx){
new_arr[i++] = arr[idx_1++];
}
while(idx_2 <= right_idx){
new_arr[i++] = arr[idx_2++];
}
for(int i = 0; i < right_idx - left_idx + 1; i++){
arr[left_idx + i] = new_arr[i];
}
delete []new_arr;
}
void mergeSort(int* arr, int left_idx, int right_idx){
if(left_idx == right_idx){
return;
}
int mid_idx = left_idx + (right_idx - left_idx) / 2;
mergeSort(arr, left_idx, mid_idx);
mergeSort(arr, mid_idx+1, right_idx);
merge(arr, left_idx, right_idx);
}
int main(){
srand(time(NULL));
int siz = 5 + rand() % 5; //[5, 9]
int *arr = new int[siz];
for(int i = 0; i < siz; i++){
int elem = rand() % 100;
std::cout << elem << " ";
arr[i] = elem;
}
std::cout << std::endl;
std::cout << "排序前:";
for(int i = 0; i < siz; i++){
std::cout << arr[i] << " ";
}
std::cout << std::endl;
mergeSort(arr, 0, siz-1);
std::cout << "排序后:";
for(int i = 0; i < siz; i++){
std::cout << arr[i] << " ";
}
std::cout << std::endl;
delete []arr;
return 0;
}