归并排序(Merging Sort)

基本思想:
假设待排序列含有n个元素,可以看成n个有序的子序列,每个字序列的长度为1,然后两两归并,得到n/2(向上取整)个长度为2或1的有序子序列;再两两归并…,重复,直到得到一个长度为n的有序序列,即为(2路归并排序)。

需要递归logn次,且每次不要O(n)的时间,因此总的时间复杂度为O(nlogn),为最好、最快即平均的时间性能。

空间复杂度为O(n)

是一种稳定 的排序算法。

#include <iostream>
#include <cstdlib>

//顺序表结构
#define MAXSIZE 10 //要排序数组个数最大值
typedef struct
{
	int r[MAXSIZE + 1]; //存储要排序数组,r[0]作为哨兵或临时变量
	int length;			//记录顺序表长度
}SqList;

//交换函数
void swap(SqList* L, int i, int j)
{
	int temp = L->r[i];
	L->r[i] = L->r[j];
	L->r[j] = temp;
}

void Merge(int SR[], int TR[], int i, int m, int n)
{
	int j, k, l;
	for (k = i ,j = m + 1; i <= m && j <= n; k++){
		if (SR[i] < SR[j]) 
			TR[k] = SR[i++];
		else
			TR[k] = SR[j++];
	}
	if (i <= m){
		for (l = 0; l <= m - i; l++)
			TR[k + l] = SR[i + l];
	}
	if (j <= n){
		for (l = 0; l <= n - j; l++)
			TR[k + l] = SR[j + l];
	}

}

void Msort(int SR[], int TR1[], int s, int t)
{
	int m;
	int TR2[MAXSIZE + 1];
	if (s == t) TR1[s] = SR[s];
	else
	{
		m = (s + t) / 2;
		Msort(SR,TR2, s, m);
		Msort(SR,TR2, m + 1, t);
		Merge(TR2, TR1, s, m, t);

	}
}

void MergeSort(SqList * L)
{
	Msort(L->r, L->r, 1, L->length);
}

void main()
{
	SqList data;
	int len = 10; //待排序列个数
	srand((int)time_t(NULL));
	data.r[0] = { 0 };
	std::cout << "排序前的数列为:";
	for (int i = 1; i <= len; ++i)
	{
		data.r[i] = rand() % 10 + 1;
		std::cout << data.r[i] << ' ';
	}
	data.length = len;

	//Qsort(&data, 1, len);
	MergeSort(&data); //快排算法

	printf("\n");
	std::cout << "排序后的数列为:";
	for (int i = 1; i <= len; ++i)
	{
		std::cout << data.r[i] << ' ';
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值