算法入门 - 分治

本文深入探讨了两种常见的分治算法——归并排序和快速排序。通过实例展示了如何将大型任务拆分为小规模子任务,分别进行排序,然后合并结果以完成整个排序过程。归并排序通过递归将数组一分为二,再进行归并,时间复杂度为O(nlogn)。而快速排序则采用选择枢轴元素并重新分布数组元素的方式,同样达到O(nlogn)的时间效率。这两种算法是数据结构与算法领域的重要内容,对于理解和优化大规模数据处理至关重要。
摘要由CSDN通过智能技术生成

把一个任务,分成形式和原任务相同,但规模更小的几个部分任务,分别完成,或只需要选一部完成。然后再处理这几个部分的结果,从而实现整个任务的完成。

分治典型应用 归并排序

① 把前一半排序

②把后一半排序

③把两半归并到一个新的有序数组,然后再拷贝回原数组

时间复杂度O(nlogn) 

#include <iostream>

using namespace std;

int a[10] = { 13, 27, 19, 2, 8, 12, 2, 8, 30, 89 };
int b[10];

// 将数组a的局部a[s,m]和a[m+1,e]合并到tmp,并保证tmp有序,然后再拷贝回a[s,e] 
void Merge(int a[],int s,int m,int e,int tmp[]){
	int pb = 0;
	int p1=s,p2=m+1;
	while(p1 <= m && p2 <= e) {
		if(a[p1] < a[p2])
			tmp[pb++] = a[p1++];
		else
			tmp[pb++] = a[p2++];
	}
	while(p1<=m){
		tmp[pb++] = a[p1++];
	}
	while(p2<=e){
		tmp[pb++] = a[p2++];
	}
	for(int i=0;i<e-s+1;++i) {
		a[s+i] = tmp[i];
	}
}

void MergeSort(int a[],int s,int e,int tmp[]) {
	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);
	}
}

int main() {
	int size = sizeof(a) / sizeof(int);
	MergeSort(a,0,size-1,b);
	for(int i = 0;i < size; ++i)
		cout << a[i] << ",";
	cout << endl;
	return 0;
}

分治典型应用 快速排序

①设k=a[0],将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边,和k相等的,在k左右出现均可。
②把k左边的快速排序
③把k右边的快速排序 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值