归并排序

归并排序

  • 什么是归并排序
    归并排序是将两个或者两个以上的有序表合并成一个有序表的过程。

  • 归并排序的算法思想
    假设初始序列含有n个记录,则可以看成n个有序的序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度n的有序序列为止。

  • 图例
    图片来源于网络

  • 代码实现

	#include<iostream>
	using namespace std;
	
	#define MAXSIZE 20
	typedef int KeyType;
	typedef struct
	{
		KeyType key;//关键字
		int other;//其他信息
	}RedType;
	
	typedef struct
	{
		RedType r[MAXSIZE];
		int length;
	}SqList;
	
	void CreateSqList(SqList& L)
	{
		cout << "表的长度:";
		cin >> L.length;
		cout << "表的关键字信息:";
		for (int i = 0; i < L.length; i++)
		{
			cin >> L.r[i].key;
		}
	}
	
	
	//比较函数
	void Merge(RedType R[], RedType T[], int low, int mid, int high)
	{
		int i = low, j = mid + 1, k = low;
		while (i <= mid && j <= high)//将R中记录由小到大放入T中
		{
			if (R[i].key <= R[j].key) T[k++] = R[i++];
			else T[k++] = R[j++];
		}
		while (i <=mid)//剩余的R[i..mid]放入T中
		{
			T[k++] = R[i++];
		}
		while (j <= high)//剩余的R[j...high]放入T中
		{
			T[k++] = R[j++];
		}
	}
	//比较函数
	
	//归并排序
	void MSort(RedType R[], RedType T[], int low, int high)
	{
		if (low == high) T[low] = R[low];
		else
		{
			RedType S[MAXSIZE];
			int mid = (low + high) / 2;//序列一分为二
			MSort(R,S,low, mid);//对前半部分进行归并排序
			MSort(R,S,mid + 1, high);//对后半部分进行归并排序
			Merge(S, T, low, mid, high);//合并
		}
	}
	//归并排序
	
	
	void Sort(SqList& L)
	{
		MSort(L.r, L.r, 0, L.length - 1);
	}
	
	void Show(SqList L)
	{
		for (int i = 0; i < L.length; i++)
		{
			cout << L.r[i].key << " ";
		}
	}
	int main()
	{
		SqList L;
		CreateSqList(L);
		Sort(L);
		cout << "排好序的表为:";
		Show(L);
		return 0;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值