2024-9-24
1.递归
自上而下递归
#include <bits/stdc++.h>
using namespace std;
void merge(int A[], int D[], int l, int r, int re){
int le = r - 1, s = re - l + 1, i = l;
while(r <= re && l <= le){
if(A[l] < A[r]) D[i++] = A[l++];
else D[i++] = A[r++];
}
while(r <= re) D[i++] = A[r++];
while(l <= le) D[i++] = A[l++];
for(i = s; i > 0; i--, re--) A[re] = D[re];
}
void M_sort(int A[], int D[], int l, int re){
int mid = (l + re) / 2;
if(l < re){
M_sort(A, D, l, mid);
M_sort(A, D, mid+1, re);
merge(A, D, l, mid+1, re);
}
}
void Merge_sort(int A[], int n){
if(A == NULL || n < 1) return;
int* D = new int[n];
M_sort(A, D, 0, n-1);
delete[] D;
}
int main() {
int A[] = {1, 9, 100, 40, 34};
int n = sizeof(A) / sizeof(A[0]); // 获取数组长度
Merge_sort(A, n); // 调用归并排序
// 输出排序后的数组
for (int i = 0; i < n; i++) {
cout << A[i] << ' ';
}
cout << endl;
return 0;
}
2. 迭代
自下而上
#include <bits/stdc++.h>
using namespace std;
void merge(int A[], int D[], int l, int r, int re){
//将数组A的两个数组(l:r与r:re+1)归并到D
int le = r - 1;
int i = l; //D元素下标
int size = re - l + 1; //元素个数
while(l <= le && r <= re){
if(A[l] < A[r]) D[i++] = A[l++];
else D[i++] = A[r++];
}
while(r <= re) D[i++] = A[r++];
while(l <= le) D[i++] = A[l++];
}
void M_sort(int A[], int D[], int n, int length){
int i = 0;
for(i = 0; i <= n - 2*length; i += 2*length) merge(A, D, i, i+length, i+2*length-1);
if(i + length < n) merge(A, D, i, i+length, n-1);
else for(; i < n; i++) D[i] = A[i];
}
void Merge_sort(int A[], int n){
if(A == NULL || n < 1) return;
int* D = new int[n];
int length = 1;
while(length < n){
M_sort(A, D, n, length);
length *= 2;
M_sort(D, A, n, length);
length *= 2;
}
delete[] D;
}
int main(){
int A[] = {1, 9, 100, 40, 34, 999, 777, 367, 234};
int n = sizeof(A)/sizeof(A[0]);
// int temA[5];
Merge_sort(A, n);
for(int i = 0; i < n; i++){
cout << A[i] << ' ';
}
cout << endl;
return 0;
}