代码:
#include <iostream>
#define MAXSIZE 1000
using namespace std;
typedef struct
{
int key;
char* otherinfo;
}RedType;
typedef struct
{
RedType* r;
int length;
}SqList;
void Create_Sq(SqList& L)
{
int i, n;
cin >> n; //输入的值不大于 MAXSIZE
for (i = 1; i <= n; i++)
{
cin >> L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for (i = 1; i <= L.length; i++)
if (i == 1)
cout << L.r[i].key;
else
cout << " " << L.r[i].key;
}
void Merge(RedType R[], RedType T[], int low, int mid, int high)
{
int i, j, k;
i = low; j = mid + 1; k = low;
while (i <= mid && j <= high)
{
if (R[i].key <= R[j].key)
T[k++] = R[i++];
else T[k++] = R[j++];
}
while (i <= mid)
T[k++] = R[i++];
while (j <= high)
T[k++] = R[j++];
}
void MSort(RedType R[], RedType T[], int low, int high)
{
int mid;
RedType* S = new RedType[MAXSIZE];
if (low == high)
T[low] = R[low];
else
{
mid = (low + high) / 2;
MSort(R, S, low, mid);
MSort(R, S, mid + 1, high);
Merge(S, T, low, mid, high);
}
}
void MergeSort(SqList& L)
{
MSort(L.r, L.r, 1, L.length);
}
int main()
{
SqList R;
R.r = new RedType[MAXSIZE + 1];
R.length = 0;
Create_Sq(R);
MergeSort(R);
show(R);
return 0;
}
运行过程:
1.创建一个结构体R,该结构体中包含一个数组R.r[i]和记录数组长度的整形lenth,初始长度赋值为0
2.将R传入Create_Sq函数,为数组赋值并记录长度。
3.将赋值好的数组传入MSort函数,实现数组的迭代分组,该数组将会不断被二分,代码逻辑上形成一棵二叉树。由于在每个二叉树度为2的结点处都创建了一个空数组,导致了该排序方式的时间复杂度为O(n)。
4.数组完成二分后,除了最底层的数组(2个数一组)被赋值,上层结点的数组还未赋值。接下来将使用Merge函数由下及上地进行数组地归并排序。在排序时我们知道mid左右两边的数组都已经是从左到右有序的了,所以在两个数组最左边各定义一个指针来比较,较小的数录入空数组,对应的指针右移即可。