面试手撕算法--归并排序

1.归并排序

//C++ 版本 递归实现
#include<iostream>
using namespace std;

/*********************函数参数说明**********************
传入参数:数组的首地址 int* number
          第一个已排序序列的起始索引 int start,第一个已排序序列的终止索引 int mid;
		  (第二个已排序序列的起始索引 mid + 1),第二个已排序序列的终止索引 int end;
********************************************************/

void Merge(int* numbers, int start, int mid, int end) {
	int* temp = new int[end - start + 1];	//第一步,申请空间,大小为两个排序序列之和
	int fistSectionIndex = start;			//第二步,设定两个待排序列的起始位置的索引
	int secondSectionIndex = mid + 1;
	int tempIndex = 0;	//所申请空间的索引

	while (fistSectionIndex <= mid && secondSectionIndex <= end) {	//直到两个序列中有一个到达终止位置
		if (numbers[fistSectionIndex] <= numbers[secondSectionIndex])
			temp[tempIndex++] = numbers[fistSectionIndex++];
		else
			temp[tempIndex++] = numbers[secondSectionIndex++];
	}

	while (fistSectionIndex <= mid)
		temp[tempIndex++] = numbers[fistSectionIndex++];

	while (secondSectionIndex <= end)
		temp[tempIndex++] = numbers[secondSectionIndex++];

	for (int j = 0; j < tempIndex; ++j)		//将合并且排序好的元素,复制到原来的数组中,释放临时数组空间
		numbers[start + j] = temp[j];

	delete[] temp;
}


void MergeSort(int* numbers, int start, int end) {
	if (numbers == NULL || start >= end)
		return;

	int mid = (start + end) / 2;

	MergeSort(numbers, start, mid);		//递归排序numbers[start,mid](首先从上往下递归分解到最底层元素个数为1的情况)
	MergeSort(numbers, mid + 1, end);	//递归排序numbers[mid + 1,end](首先从上往下递归分解到最底层元素个数为1的情况)

	Merge(numbers, start, mid, end);	//然后递归的从下往上合并排序
}

int main() {
	int a[10] = { 5,6,1,8,3,4,9,7,2,3 };
	cout << "归并排序前:";
	for (int i = 0; i < 10; i++)
		cout << a[i] << ' ';
	cout << endl;

	MergeSort(a, 0, 9);

	cout << "归并排序后:";
	for (int i = 0; i < 10; i++)
		cout << a[i] << ' ';
	cout << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值