【算法导论】2分治法

news/2025/10/31 22:26:13/文章来源:https://www.cnblogs.com/miki969696/p/19181377

【算法导论】2分治法

二分查找

using System;class BinarySearch
{// 分治法实现二分查找public static int Search(int[] arr, int target, int left, int right){// 基本情况:查找范围为空if (left > right)return -1;// 分解:取中间位置int mid = left + (right - left) / 2;// 解决:找到目标if (arr[mid] == target)return mid;// 合并:递归处理左半部分或右半部分if (arr[mid] > target)return Search(arr, target, left, mid - 1);  // 目标在左半部分elsereturn Search(arr, target, mid + 1, right); // 目标在右半部分}public static void Main(){int[] arr = { 2, 5, 8, 12, 16, 23, 38, 56, 72, 91 };int target = 23;int result = Search(arr, target, 0, arr.Length - 1);if (result != -1)Console.WriteLine($"元素 {target} 找到,索引为 {result}");elseConsole.WriteLine($"元素 {target} 未找到");}
}

2. 归并排序(分治法经典应用)

using System;class MergeSort
{// 分治法主方法public static void Sort(int[] arr, int left, int right){// 基本情况:子数组长度为1时无需排序if (left < right){// 分解:计算中间位置int mid = left + (right - left) / 2;// 递归处理左右两部分Sort(arr, left, mid);Sort(arr, mid + 1, right);// 合并:将两个有序子数组合并Merge(arr, left, mid, right);}}// 合并两个有序子数组private static void Merge(int[] arr, int left, int mid, int right){int n1 = mid - left + 1;int n2 = right - mid;// 创建临时数组int[] leftArr = new int[n1];int[] rightArr = new int[n2];// 复制数据到临时数组Array.Copy(arr, left, leftArr, 0, n1);Array.Copy(arr, mid + 1, rightArr, 0, n2);// 合并临时数组到原数组int i = 0, j = 0, k = left;while (i < n1 && j < n2){if (leftArr[i] <= rightArr[j])arr[k++] = leftArr[i++];elsearr[k++] = rightArr[j++];}// 处理剩余元素while (i < n1)arr[k++] = leftArr[i++];while (j < n2)arr[k++] = rightArr[j++];}public static void Main(){int[] arr = { 12, 11, 13, 5, 6, 7 };Console.WriteLine("排序前数组:");Console.WriteLine(string.Join(" ", arr));Sort(arr, 0, arr.Length - 1);Console.WriteLine("排序后数组:");Console.WriteLine(string.Join(" ", arr));}
}

3. 快速排序(分治法高效排序)

using System;class QuickSort
{// 分治法主方法public static void Sort(int[] arr, int low, int high){if (low < high){// 分解:获取基准元素位置(分区操作)int pi = Partition(arr, low, high);// 递归排序基准元素左右两部分Sort(arr, low, pi - 1);Sort(arr, pi + 1, high);}}// 分区操作:将小于基准的元素放左边,大于的放右边private static int Partition(int[] arr, int low, int high){int pivot = arr[high];  // 选择最右元素作为基准int i = low - 1;        // 小于基准区域的边界for (int j = low; j < high; j++){// 如果当前元素小于等于基准,扩展小于区域if (arr[j] <= pivot){i++;// 交换元素(arr[i], arr[j]) = (arr[j], arr[i]);}}// 将基准元素放到正确位置(arr[i + 1], arr[high]) = (arr[high], arr[i + 1]);return i + 1;}public static void Main(){int[] arr = { 10, 7, 8, 9, 1, 5 };Console.WriteLine("排序前数组:");Console.WriteLine(string.Join(" ", arr));Sort(arr, 0, arr.Length - 1);Console.WriteLine("排序后数组:");Console.WriteLine(string.Join(" ", arr));}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++写得多不如写得少,同样的逻辑写的多报错逆天

#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<uno…

整理数学数据结构

#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 5;//树 struct tree{int to[N << 1], nxt[N << 1], hd[N], idx, w[N << 1];void add(int u, int v, int val) { to[++ idx]…

viewerjs+vue3 using typescript

安装包npm install v-viewer viewerjs npm i fontawesome-4.7 npm install @fortawesome/fontawesome-svg-core npm install @fortawesome/free-solid-svg-icons npm install @fortawesome/vue-fontawesome@prerelease…

题解:B4207 [常州市赛 2021] 战士

题解:B4207 [常州市赛 2021] 战士 前言 题目传送门 思路讲解 思路其实很好想,因为怪物的攻击是固定的,所以战士的死亡时间也是固定的,我们就需要通过计算战士每次死亡前能造成的最大伤害如果可以击败怪物,那就直接…

最小二乘问题详解7:正则化最小二乘

本文系统阐述了正则化最小二乘(岭估计)的动机、理论推导、求解方法与数值实例,揭示其通过L2惩罚项改善病态问题和过拟合的机制。1. 引言 在之前的文章《最小二乘问题详解4:非线性最小二乘》、《最小二乘问题详解5:…

什么是重组蛋白?

重组蛋白的定义与基本概念 重组蛋白是指通过基因工程技术,将外源基因导入宿主细胞,利用细胞的生物合成系统表达产生的蛋白质分子。这项技术的核心在于基因重组,即通过人工手段将编码目标蛋白的DNA序列插入表达载体,…

Day9文字颜色

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

代码大全2{3}

高质量代码要易理解、易扩展。书中关于类设计、接口定义的原则,结合具体示例讲解如何降低代码耦合度,逻辑清晰且实用性强。“单一职责原则” 避免 “万能类 / 函数”带来的问题,划分职责界限,比如一个 “用户管理”…

work3

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13574 学号:102500331 姓名:余武 一.书本第4章4.8编程练习题目中的第…

25.10.31

AGC001D 很早之前看到一度怀疑是错题,然后今天发现我看错题了,原来是说这个序列只包含一种元素啊…… 一个 \(l\) 长的回文串定下了 \(\frac{l}{2}\) 的等价关系,可以视作连边,于是转化出图论模型。 考虑无解是为什…

关于计数

随时施工( 不欢迎来看感觉必须开一个记录计数trick的专栏了,md计数题的式子太e心了(((((

游记2

等出分了,进NOIP了写。

JSON Web Token安全漏洞实战:无需确认令牌验证邮箱与密码重置

本文详细介绍了如何通过篡改JSON Web Token实现邮箱验证绕过、密码重置和账户接管,包含具体的技术操作步骤和漏洞利用方法,展示了JWT在未正确验证签名时的安全风险。玩转JSON Web Token:乐趣与收益并存 大家好,希望…

软考-关于《网络安全法》修订相关题目(10道)

根据2025年10月28日通过的《网络安全法》修改决定,该修正案将于何时正式施行?A. 2025年11月1日 B. 2025年12月1日 C. 2026年1月1日 D. 2026年3月1日 答案:C 解析:文章明确指出"自2026年1月1日起施行"。新…

【算法初步】1插入排序

【算法初步】1插入排序using System;class InsertionSortExample {static void Main(){// 测试数组int[] array = { 12, 11, 13, 5, 6 };Console.WriteLine("排序前的数组:");PrintArray(array);// 执行插入…

WebRTC实时音视频通信核心原理

寻常的WebSocket流程是这样的如果都与服务器进行交流,会造成服务器压力大,通讯时间长,实时效果不好,那么怎么解决? 这就要用到我们接下来讲的WebRTC实时通讯 拿出笔记本,让我们开冲!! 概念 WebRTC(Web Real-Ti…

Python高阶和匿名函数 _ 脱了马甲也要认识

Python高阶和匿名函数 _ 脱了马甲也要认识def calculate_and_print(num, calculator, formatter): result = calculator(num) formatter(num, result)def print_with_vertical_bar(num, result): print(f&quo…

第11天(中等题 滑动窗口)

打卡第十一天 1道简单题+2道中等题越短越合法型滑动窗口: 实例由于子数组越长,乘积越大,越不能满足题目要求;反之,子数组越短,乘积越小,越能满足题目要求。有这种性质的题目,可以用滑动窗口解决。内层循环结束后…

麒麟 V10系统中离线安装python的setuptools和pip,并使用python代码查询达梦数据库,并上传文件到minio

麒麟 V10系统中默认安装了python3.7版本,但是没有安装pip命令 1.python 环境安装1.下载Python版本对用的 setuptools和pip版本 源码包下载地址:setuptools:https://pypi.org/project/setuptools/#files(选择.tar.g…

如何选择陶瓷放电管

陶瓷放电管GDT原理:气体放电。电管有一脉冲击穿电压,不工作状态是电路处于断路,电阻大,电容小。一旦脉冲过压达到放电管的脉冲击穿电压,极间的电场强度超过气体的击穿强度时,就引起间隙放电,管内气体电离,放电…