#include <stdio.h>
#include <vector>
#include <conio.h>
#define ARRAY_LEN 16
#define START 0
#define END 15
using std::vector;
void Merge(int *data, const int start, const int middle, const int end)
{
//求前后两段数组的长度
const int length1 = (middle - start + 1);
const int length2 = (end - middle);
//将前后两段数组复制到新创建的数组
//int data1[length1] = {0};
//int data2[length2] = {0};
vector<int> data1;
vector<int> data2;
for (int i = 0; i < length1; i++)
{
data1.push_back(data[start + i]);
}
for (int i = 0; i < length2; i++)
{
data2.push_back(data[middle + i + 1]);
}
int i = 0;
int j = 0;
//总共将循环 end - start 次
for (int k = start; k <= end; k++)
{
/*
可以在data1和data2最后各另设一 MAX int来作为哨兵,那样的话将不需要下面的两个if判断
*/
if (i == length1) //若data1中数据比较完,则将data2中的数据存入data
{
data[k] = data2[j];
j++;
continue;
}
if (j == length2) //若data2中数据比较完,则将data1中的数据存入data
{
data[k] = data1[i];
i++;
continue;
}
if (data1[i] < data2[j]) //依次比较data1和data2中数据,将较小的存入data
{
data[k] = data1[i];
i++;
}
else
{
data[k] = data2[j];
j++;
}
}
}
//递归排序
void MergeSort(int *data, const int start, const int end)
{
if(start < end)
{
const int middle = (start + end) / 2;
MergeSort(data, start, middle);
MergeSort(data, middle + 1, end);
Merge(data, start, middle, end); //将排好序的两个子数组合并
}
}
int main()
{
int data[] = {2,43,53,2,4,54,23,66,2343,23,523,21,45,53,34,423};
MergeSort(data, START, END); //合并排序data数组中START到END的数
for (int i = 0; i < ARRAY_LEN; i++)
{
printf("%d ", data[i]);
}
getch();
return 0;
}