归并排序分为自下而上和自上而下
自下而上
#include <bits/stdc++.h>
#include <malloc.h>
using namespace std;
void Merge(int arr[], int low, int mid , int high){
int i = low, j = mid + 1;
int k = 0;
int *temp =(int *) malloc ((high - low + 1) * sizeof(int));
while(i <= mid && j <= high )
if(arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
while(i <= mid)
temp[k++] = arr[i++];
while(j <= high)
temp[k++] = arr[j++];
for(k = 0, i = low; i <= high ; k++,i++)
arr[i] = temp[k];
free(temp);
}
void MergePass(int arr[], int length, int n){
int i;
for(i =0; i + 2 * length -1 < n; i = i + 2 * length)
Merge(arr,i , i + length - 1, i + 2 * length -1);
if(i + length -1 < n)
Merge(arr, i, i + length - 1, n -1);
}
void MergeSort(int arr[], int n){
int length;
for(length = 1; length < n; length = 2*length)
MergePass(arr, length, n);
}
void disp(int arr[], int n) {
for(int i = 0; i < n; i++)
cout << " "<< arr[i];
cout << endl;
}
int main(){
int a[] = {2, 5, 1, 7, 10, 6, 9, 4, 3, 8};
int n = sizeof(a) / sizeof(a[0]);
cout << "排序前:";
disp(a,n);
MergeSort(a, n);
cout << "排序后:";
disp(a,n);
return 0;
}
自上而下
#include <bits/stdc++.h>
#include <malloc.h>
using namespace std;
void Merge(int arr[], int low, int mid , int high){
int i = low, j = mid + 1;
int k = 0;
int *temp =(int *) malloc ((high - low + 1) * sizeof(int));
while(i <= mid && j <= high )
if(arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
while(i <= mid)
temp[k++] = arr[i++];
while(j <= high)
temp[k++] = arr[j++];
for(k = 0, i = low; i <= high ; k++,i++)
arr[i] = temp[k];
free(temp);
}
void MergeSort(int arr[], int low, int high){
int mid;
if(low < high){
mid = (high + low) / 2;
MergeSort(arr, low, mid);
MergeSort(arr, mid + 1, high);
Merge(arr, low, mid, high);
}
}
void disp(int arr[], int n) {
for(int i = 0; i < n; i++)
cout << " "<< arr[i];
cout << endl;
}
int main(){
int a[] = {2, 5, 1, 7, 10, 6, 9, 4, 3, 8};
int n = sizeof(a) / sizeof(a[0]);
cout << "排序前:";
disp(a,n);
MergeSort(a, 0, n - 1);
cout << "排序后:";
disp(a,n);
return 0;
}