前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【精选】算法设计与分析(第三章分治法)

【精选】算法设计与分析(第三章分治法)

作者头像
命运之光
发布2024-03-20 13:53:23
1050
发布2024-03-20 13:53:23
举报
文章被收录于专栏:我在本科期间写的文章

前言

总结算法设计与分析课程期末必记知识点。

第三章分治法
1、分治法概念

分治法是使用最广泛的算法设计方法之一。其基本策略是采用递归思想把大问题分解成一些小问题,然后由小问题的解方便地构造出大问题的解。

2、分治法所能解决的问题一般具有以下几个特征

(1)该问题的规模缩小到一定的程度就可以容易地解决。 (2)该问题可以分解为若干个规模较小的相似问题。 (3)利用该问题分解出的子问题的解可以合并为该问题的解。 (4)该问题所分解出的各个子问题是互相独立的,即子问题之间不包含公共的子问题。

3、分治法的求解过程(简答)

(1)分解成若干个子问题 (2)求解子问题 (3)合并子问题

4、快速排序(大题)
代码语言:javascript
复制
#include<stdio.h>

void disp(int a[],int n){	//输出 a 中的所有元素 
	int i;
	for(i=0;i<n;i++)
		printf("%d",a[i]);
	printf("\n");
}

int Partition(int a[], int s, int t)	//划分算法
{
	int i = s, j = t;
	int tmp = a[s];						//用序列的第 1 个记录作为基准
	while (i != j)						//从序列两端交替向中间扫描,直到 i=j为止
	{
		while (j > i && a[j] >= tmp)	
			j--;						//从右向左扫描,找第 1 个关键字大于 tmp 的a[i]
		a[i] = a[j];					//将a[i]后移到a[j]的位置
		while (i < j && a[i] <= tmp)
			i++;						//从左向右扫描,找第 1 个关键字大于 tmp 的a[i]
		a[j] = a[i];					//将 a[i]后移到a[j]的位置
	}
	a[i] = tmp;
	return i;
}

void QuickSort(int a[], int s, int t)		//对a[s..t]元素序列进行递增排序
{
	if (s < t)
	{
		int i = Partition(a, s, t);
		QuickSort(a, s, i - 1);				//对左子序列递归排序
		QuickSort(a, i + 1, t);				//对右子序列递归排序
	}
}

int main() {
	int n = 5;
	int a[] = { 5,2,3,1,4 };
	printf("排序前:");
	disp(a, n);
	QuickSort(a, 0, n - 1);
	printf("排序后:");
	disp(a, n);
	return 0;
}
5、冒泡排序和简单选择排序的时间复杂度

冒泡排序:时间复杂度O(n^2) 简单选择排序:时间复杂度 O(n^2)

6、快速排序的时间复杂度

时间复杂度

O(nlog_2n)
O(nlog_2n)
7、自顶向下的二路归并排序算法
代码语言:javascript
复制
void MergeSort(int a[], int low, int high)	//二路归并算法
{
	int mid;
	if (low < high)							//子序列有两个或两个以上元素
	{
		mid = (low + high) / 2;				//取中间位置
		MergeSort(a, low, mid);				//对a[low..mid]子序列排序
		MergeSort(a, mid + 1, high);		//对a[mid+1..high]子序列排序
		Merge(a, low, mid, high);		//将两个子序列合并,见前面的算法
	}
}

时间复杂度为

O(nlog_2n)
O(nlog_2n)
8、折半查找算法
代码语言:javascript
复制
#include<stdio.h>
int BinSearch(int a[], int low, int high, int k)//折半查找算法
{
	int mid;
	if (low <= high)			//当前区间存在元素时
	{
		mid = (low + high) / 2; //求查找区间的中间位置
		if (a[mid] == k)			//找到后返回其物理下标mid
			return mid;
		if (a[mid] > k)				//当a[mid]>k时在a[low..mid-1]中递归查找
			return BinSearch(a, low, mid - 1, k);
		else                        //当a[mid]<k时在a[mid+1..high]中递归查找
			return BinSearch(a, mid + 1, high, k);
	}
	else return -1;					//当前查找区间没有元素返回-1
}
int main() {
	int n = 10, i;
	int k = 6;
	int a[] = { 1,2,3,4,5,6,7,8,9,10 };
	i = BinSearch(a, 0, n - 1, k);
	if (i >= 0)
		printf("a[%d]=%d\n", i, k);
	else
		printf("未找到%d元素\n", k);
	return 0;
}
结语

第三章分治法结束,下一章——第四章蛮力法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 第三章分治法
      • 1、分治法概念
      • 2、分治法所能解决的问题一般具有以下几个特征
      • 3、分治法的求解过程(简答)
      • 4、快速排序(大题)
      • 5、冒泡排序和简单选择排序的时间复杂度
      • 6、快速排序的时间复杂度
      • 7、自顶向下的二路归并排序算法
      • 8、折半查找算法
    • 结语
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档