以下的图片来自网络资料:https://www.jianshu.com/p/33cffa1ce613
归并排序的思路图示:
合并两个有序数列的流程思路:
C语言的实现代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
void print(int data[], int n)
{
for (int i = 0; i < n; i++)
{
cout << data[i] << " ";
}
cout << endl;
}
void merge(int data[], int tmp[], int lpos, int rpos, int rend)
{
int i, lend, num, tmppos;
lend = rpos - 1;
tmppos = lpos;
num = rend - lpos + 1;
while (lpos <= lend && rpos <= rend)
{
if (data[lpos] <= data[rpos])
tmp[tmppos++] = data[lpos++];
else
tmp[tmppos++] = data[rpos++];
}
while (lpos <= lend)
tmp[tmppos++] = data[lpos++];
while (rpos <= rend)
tmp[tmppos++] = data[rpos++];
for (i = 0; i < num; i++, rend--)
{
data[rend] = tmp[rend];
}
}
void merge_sort(int data[], int tmp[], int low, int high)
{
if (low >= high)
{
return;
}
int middle = (low + high) / 2;
merge_sort(data,tmp, low,middle);
merge_sort(data, tmp, middle + 1, high);
merge(data, tmp, low, middle+1, high);
}
void merge_ascending_sort(int data[], int len)
{
int i = 0, j = 0, x = 0;
int *tmp = NULL;
tmp = new int[len];
if (NULL != tmp)
{
merge_sort(data, tmp, 0, len-1);
delete[]tmp;
}
}
void merge_des(int data[], int tmp[], int lpos, int rpos, int rend)
{
int i, lend, num, tmppos;
lend = rpos - 1;
tmppos = lpos;
num = rend - lpos + 1;
while (lpos <= lend && rpos <= rend)
{
if (data[lpos] <= data[rpos])
tmp[tmppos++] = data[rpos++];
else
tmp[tmppos++] = data[lpos++];
}
while (lpos <= lend)
tmp[tmppos++] = data[lpos++];
while (rpos <= rend)
tmp[tmppos++] = data[rpos++];
for (i = 0; i < num; i++, rend--)
{
data[rend] = tmp[rend];
}
}
void merge_dessort(int data[], int tmp[], int low, int high)
{
if (low >= high)
{
return;
}
int middle = (low + high) / 2;
merge_dessort(data, tmp, low, middle);
merge_dessort(data, tmp, middle + 1, high);
merge_des(data, tmp, low, middle + 1, high);
}
void merge_desending_sort(int data[], int len)
{
int i = 0, j = 0, x = 0;
int *tmp = NULL;
tmp = new int[len];
if (NULL != tmp)
{
merge_dessort(data, tmp, 0, len - 1);
delete[]tmp;
}
}
int main()
{
int num[] = {5,3, 7,4,3,9,6,2,10,4,3,7,1};
int len = sizeof(num) / sizeof(int);
cout << "data count:"<< len << ". before sort: ";
print(num, len);
merge_ascending_sort(num, len);
cout << "after ascending sort: ";
print(num, len);
merge_desending_sort(num, len);
cout << "after desending sort: ";
print(num, len);
return 0;
}
测试结果:
data count:13. before sort: 5 3 7 4 3 9 6 2 10 4 3 7 1
after ascending sort: 1 2 3 3 3 4 4 5 6 7 7 9 10
after desending sort: 10 9 7 7 6 5 4 4 3 3 3 2 1
请按任意键继续. . .