#include "iostream"
#include "cstdlib"
#include "ctime"
using namespace std;
void merge(int* arr, int p, int q, int r);
void Merge_Sort(int* arr, int p, int r);
int* text_Seed_Time(int n);
int main()
{
int arr_Size;
cout << "Please enter the size of arr: ";
cin >> arr_Size;
int* text_Arr = new int[arr_Size];
cout << "下面是随机产生的一个数组: ";
for (int i = 0; i<arr_Size; i++)
{
text_Arr[i] = *(text_Seed_Time(arr_Size) + i);
}
for (int i = 0; i<arr_Size; i++)
{
cout << text_Arr[i] << " ";
}
Merge_Sort(text_Arr, 0, arr_Size - 1);
cout << endl << "通过并归排序的结果: " << endl;
for (int i = 0; i<arr_Size; i++)
{
cout << text_Arr[i] << " ";
}
cin.get();
cin.get();
}
void merge(int* arr, int p, int q, int r) //其中arr为数组, p,q,r分别为数组下标(p<q<r)
{
//先定义两个新的子数组,并将它们初始化为 数组arr,已经排好序的两端。
int left_Count = q - p + 1;
int right_Count = r - q;
//int left_Arr[left_Count + 1]; //多设置一位为哨兵值,用于判断在比较的时候是否某一个数组已经比较完成;
//int right_Arr[right_Count + 1];
int* left_Arr = new int[left_Count + 1];
int* right_Arr = new int[right_Count + 1];
for (int i = 0; i<left_Count; i++)
left_Arr[i] = arr[p+i];//left_Arr[i] = arr[p] 这是自己第一次写的时候找半天没找到的Bug忘记加上变量i,将同一个值赋值给整个数组。
for (int i = 0; i<right_Count; i++)
right_Arr[i] = arr[q + 1+i];//此语句同上。
left_Arr[left_Count] = right_Arr[right_Count] = 10000;
int left_i = 0;
int right_i = 0;
for (int i = 0; i<(r - p + 1); i++)
{
if (left_Arr[left_i] <= right_Arr[right_i])
{
arr[p + i] = left_Arr[left_i];
left_i++;
}
else
{
arr[p + i] = right_Arr[right_i];
right_i++;
}
}
}
void Merge_Sort(int* arr, int p, int r)
{
if (p<r)
{
int q = (p + r) / 2;
Merge_Sort(arr, p, q);
Merge_Sort(arr, q + 1, r);
merge(arr, p, q, r);
}
}
int* text_Seed_Time(int n)
{
int* TSV = new int[n];
srand((unsigned)time(NULL));
for (int i = 0; i<n; i++)
TSV[i] = rand() % (n * 2) + 1; //产生的数组值的大小范围是(0 n*2) 其中n为数组的规模大小;
return TSV;
}
下面是测试结果: