归并排序

1. 问题描述



2. 算法思想

利用分而治之和递归的思想将数据序列划分成越来越小的子表,再对子表排序,最后用递归的方法将排好序的子表合并为越来越大的有序序列。归并排序包括两个步骤:

1)        划分子表并排序

2)        合并子表

常见的为二路归并排序。

 

3. 伪代码实现





4. C++实现

 

const int MAXSIZE = 20;
typedef struct RecordType{
    KeyType key;
    InfoType otherinfo;
}RecordType;

typedef struct SqList{
    RecordType r[MAXSIZE];
    int length;
}SqList;


#include <cassert>
#include <vector>
/*
Pre:  "A" is an array. "A.r[p...q]" and "A.r[q+1...r]" are both sorted.
      q>=p and r>=q must hold.
Post: merge the two sorted sub_array so that "A.r[p...r]" is sorted.
*/
void merge(SqList &A, int p, int q, int r)
{
	assert(q>=p && r>=q);

	const int n1 = q - p + 1;
	const int n2 = r - q;
	std::vector<RecordType> L(n1);
	std::vector<RecordType> R(n2);

	for (int i=0; i<n1; ++i)
		L[i] = A.r[p + i];
	for (int j=0; j<n2; ++j)
		R[j] = A.r[q + j + 1];

	int i = 0;
	int j = 0;
	for (int k=p; k<=r; ++k)
	{
		if (i<L.size() && j<R.size())
		{
			if (L[i].key <= R[j].key)			
				A.r[k] = L[i++];				
			else
				A.r[k] = R[j++];	
		}
		else
		{
			if (i < L.size())
				A.r[k] = L[i++];			
			if(j < R.size())	
				A.r[k] = R[j++];
		}
	}
}

// 归并排序
void merge_sort(SqList &L, int p, int r)
{
	assert(p <= r);

	if (p < r)
	{
		int q = (p + r) / 2;
		merge_sort(L, p, q);
		merge_sort(L, q+1, r);
		merge(L, p, q, r);
	}
}


4. 算法复杂度分析

时间复杂度:


空间复杂度为

稳定排序算法。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值