代码:
#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; //输入的值不大于 MAXSIZEfor (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;elsecout << " " << 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左右两边的数组都已经是从左到右有序的了,所以在两个数组最左边各定义一个指针来比较,较小的数录入空数组,对应的指针右移即可。