分治思想——归并排序

分治的基本思想:将原任务分成几个小任务(通常是两个)来分别完成,然后再将完成的几个任务经过处理后实现最终任务的完成。

归并排序的原理:

1.将待排序的数组分成两半

2.将数组的前一半和后一半分别排序。

3.将两半归并到新的有序数组,然后再拷贝回原来的数组。排序完成。

代码:

#include<iostream>
using namespace std;
void merge(int a[], int s, int m, int e, int tmp[]) {
	//将a[]中排好序的前一半和后一半有序的放到tmp中,再拷贝回a[]
	int i = s, j = m + 1;
	int p = s;
	while(i<=m&&j <= e)
	{
		if (a[i] < a[j])//a[s]<a[m+1]
		{
			tmp[p++] = a[i++];
		}
		else
		{
			tmp[p++] = a[j++];
		}
	}
	//剩下的依次拷贝到tmp
	while (i<=m)
	{
		tmp[p++] = a[i++];
	}
	while (j <= e)
	{
		tmp[p++] = a[j++];
	}
	//拷贝回a[]
	i =s,p=s;
	while (i <= e) {
		a[i++] = tmp[p++];
	}
}

void mergeSort(int a[], int s, int e, int tmp[]) {//s:要排序的初始位置 e:结束排序的位置
	
	if (s < e)
	{
		int m =s+ (e - s) / 2;
		mergeSort(a, s, m, tmp);
		mergeSort(a, m + 1, e, tmp);
		merge(a, s, m, e, tmp);
	}
	//退出条件:s=e,只剩一个元素结束排序
}
int main() {
	int a[10] = { 1,2,6,41,11,17,23,0,98,5};
	int b[10] = {0};//临时储存空间
	int size = sizeof(a) / sizeof(int);
	mergeSort(a, 0, size - 1, b);
	for (int i = 0; i < size; i++) {
		cout << a[i] << ' ';
	}
    system("pause");
	return 0;
}

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值