【2023.11.29】2-路归并排序学习

代码:

​
#include 
#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左右两边的数组都已经是从左到右有序的了,所以在两个数组最左边各定义一个指针来比较,较小的数录入空数组,对应的指针右移即可。

你可能感兴趣的:(学习日志,学习,算法,数据结构)