归并排序–递归实现
#include <iostream>
using namespace std;
int* a = new int[100];
void Merge(int* arr, int left, int mid, int right){
for(int i = left; i <= right; i++){
a[i] = arr[i];
}
int i, j, k;
for(i = left, j = mid + 1, k = i; i <= mid&&j <= right; k++){
if(a[i] <= a[j]){
arr[k] = a[i++];
}else{
arr[k] = a[j++];
}
}
while(i <= mid){
arr[k++] = a[i++];
}
while(j <= right){
arr[k++] = a[j++];
}
}
void Mergesort(int* arr, int left, int right){
if(left < right){
int mid = (left + right)/2;
Mergesort(arr, left, mid);
Mergesort(arr, mid+1, right);
Merge(arr, left, mid, right);
}
}
int main(){
int arr[] = {123, 11, 33, 23, 24, 23, 111};
int len = sizeof(arr)/sizeof(arr[0]);
Mergesort(arr, 0, len-1);
for(int i = 0; i < len; i++){
cout << arr[i] << " ";
}
cout << endl;
delete[] a;
return 0;
}
归并排序–非递归实现
#include <iostream>
#include <stack>
using namespace std;
int* a = new int[100];
void Merge(int* arr, int left, int mid, int right){
for(int i = left; i <= right; i++){
a[i] = arr[i];
}
int i, j, k;
for(i = left, j = mid + 1, k = i; i <= mid&&j <= right; k++){
if(a[i] <= a[j]){
arr[k] = a[i++];
}else{
arr[k] = a[j++];
}
}
while(i <= mid){
arr[k++] = a[i++];
}
while(j <= right){
arr[k++] = a[j++];
}
}
void Mergesort(int* arr, int left_, int right_){
int size = 1;
int right, left, mid;
int len = right_ - left_ + 1;
while(size <= len - 1){
left = 0;
while(left + size <= len - 1){
mid = left + size -1;
right = mid + size;
if(right > len - 1){
right = len - 1;
}
Merge(arr, left, mid, right);
left = right + 1;
}
size *= 2;
}
}
int main(){
int arr[] = {123, 11, 33, 23, 24, 23, 111};
int len = sizeof(arr)/sizeof(arr[0]);
Mergesort(arr, 0, len-1);
for(int i = 0; i < len; i++){
cout << arr[i] << " ";
}
cout << endl;
delete[] a;
return 0;
}