归并排序

26 阅读2分钟

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;
}