一种是由上到下
#include <iostream>;
using namespace std;
void merge(int a[], int start, int mid, int end,int temp[])
{
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (a[i] <= a[j]) {
temp[k++] = a[i++];
}
else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= end) {
temp[k++] = a[j++];
}
k = 0;
while (start <= end) {
a[start++] = temp[k++];
}
}
/*
* 归并排序(从上往下)
*
* 参数说明:
* a -- 待排序的数组
* start -- 数组的起始地址
* endi -- 数组的结束地址
*/
void merge_sort_up2down(int a[], int start, int end,int temp[])
{
if (a == NULL || start >= end) {
return;
}
int mid = (start + end) / 2;
merge_sort_up2down(a, start, mid, temp);
merge_sort_up2down(a, mid + 1, end, temp);
merge(a, start, mid, end, temp);
}
这种是从下到上,不用递归
/*
*归并排序(从下往上)
*
* 参数说明:
* a -- 待排序的数组
* start -- 数组的起始地址
* endi -- 数组的结束地址
*/
void merge(int a[], int start, int mid, int end,int temp[])
{
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (a[i] <= a[j]) {
temp[k++] = a[i++];
}
else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= end) {
temp[k++] = a[j++];
}
k = 0;
while (start <= end) {
a[start++] = temp[k++];
}
}
void merge_groups(int a[], int len,int sub_len,int temp[]) {
int i;
for (i = 0; i + 2 * sub_len - 1 < len; i += 2 * sub_len) {
merge(a, i, i + sub_len - 1, i + 2 * sub_len - 1, temp);
}
if (i + sub_len - 1 < len - 1) {
merge(a, i, i + sub_len - 1, len - 1, temp);
}
}
void merge_sort_down2up(int a[], int len,int temp[])
{
int n;
if (a == NULL || len < 0) {
return;
}
for (int i = 1; i < len; i *= 2) {
merge_groups(a, len, i, temp);
}
}