最坏与最优情况时间复杂度:
O(nlogn)
思路:首先对数组进行分组(拆解)变成单个,用到辅助数组,后对其合并(也是排序过程)
注意 先建立辅助数组 -----》对数组进行拆分(递归拆分)--------》进行合并(合并到辅助数组里)-----》将辅助数组复制到原数组
#include <iostream>
using namespace std;
void Merge(int arr[], int trr[], int left, int mid, int right) {
int l_pos = left;
int r_pos = mid + 1;
int pos = left;
while (l_pos <= mid && r_pos <= right) {
if (arr[l_pos] < arr[r_pos]) {
trr[pos++] = arr[l_pos++];
} else {
trr[pos++] = arr[r_pos++];
}
}
while (l_pos <= mid) {
trr[pos++] = arr[l_pos++];
}
while (r_pos <= right) {
trr[pos++] = arr[r_pos++];
}
for (int i = left; i <= right; i++) {
arr[i] = trr[i];
}
}
void msort(int arr[], int trr[], int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
msort(arr, trr, left, mid);
msort(arr, trr, mid + 1, right);
Merge(arr, trr, left, mid, right);
}
}
void merge_sort(int arr[], int n) {
int *trr = new int;
if (trr) {
msort(arr, trr, 0, n - 1);
}
}
int main() {
int a[10] = {2, 4, 3, 1, 5, 6, 8, 7, 9, 0};
merge_sort(a, 10);
for (int i = 0; i < 10; i++) {
cout << a[i] << " ";
}
return 0;
}