递归形式----归并排序
递归主要的实质就在左右排好序的数组如何重排在一起
这里要特别注意一点
int left_index = start;//左边数组起始位置计数器
int right_index = start + mid+1;//右边数组起始位置mid+1+start计数器
start一定要写,为什么呢?我一开始认为start我传入的时候是0啊,加不加都无所谓啊。但是在递归的过程中,例如红框划出来的地方,在递归过程中传入的start实际上是(end - start + 1) / 2 + start + 1,图上的start就是3
merge_sort(data, (end - start + 1) / 2 + start + 1, end, result);//右边起始点mid+1`
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <time.h>
#define Max 20
using namespace std;
void merge(int *data, int start, int end, int *result);
void merge_sort(int *data, int start, int end, int *result)
{
if (1 == end - start)//如果区间中只有两个元素,则对这两个元素进行排序(1-0=1)
{
if (data[start] > data[end])//这里是升序排序,前面数字比后方大就交换
{
int temp = data[start];
data[start] = data[end];
data[end] = temp;
}
return;//如果data[start] < data[end]就结束
}
if (0 == end - start)//如果只有一个元素,则不用排序
return;
//继续划分子区间,分别对左右子区间进行排序
merge_sort(data, start, (end - start + 1) / 2 + start, result);//左边结束点下标mid=(end - start + 1) / 2 + start
merge_sort(data, (end - start + 1) / 2 + start + 1, end, result);//右边起始点mid+1
//开始归并已经排好序的start到end之间的数据
merge(data, start, end, result);//归并数据
//把排序后的区间数据复制到原始数据中去
for (int i = start; i <= end; ++i)
data[i] = result[i];
}
void merge(int *data, int start, int end, int *result)//源数组,起始节点下标,结束点下标,整合结果数组
{
int mid = (end - start + 1) / 2;
int left_Max = mid + 1;//左部分区间的数据元素的个数mid+1(因为左边末尾节点为mid,数组下标从0开始)
int left_index = start;//左边数组起始位置计数器
int right_index = start + mid+1;//右边数组起始位置mid+1+start计数器
int result_index = start;
while (left_index < start + left_Max && right_index < end + 1)//左边计数器和右边计数器不越界
{
//对分别已经排好序的左区间和右区间进行合并
if (data[left_index] <= data[right_index])//左右两部分数组比较
result[result_index++] = data[left_index++];//谁小就赋值给结果数组,然后结果计数器和该赋值数组计数器++
else
result[result_index++] = data[right_index++];
}
while (left_index < start + left_Max)//左边计数器还没满,代表右部分已经全部入数组,因为左右都是已经排好序的数组,下面只要将左部分加入即可
result[result_index++] = data[left_index++];
while (right_index < end + 1)//右边计数器还没满,代表左边已经完全进入数组
result[result_index++] = data[right_index++];
}
int main()
{
srand((unsigned int)time(NULL));//随机数
int num[Max];
for (int i = 0; i < Max; ++i)
{
int mum = rand() % Max;//随机数种子
num[i] = mum;
}
int result[Max];//辅助数组
cout << "Before sorted:" << endl;
for (int i = 0; i < Max; ++i)
cout << num[i] << " ";
cout << endl;
cout << "After sorted:" << endl;
merge_sort(num, 0, Max - 1, result);
for (int i = 0; i < Max; ++i)
cout << num[i] << " ";
cout << endl;
system("pause");
return 0;
}