数据结构与算法之排序: 归并排序 (Ts, Py, Go版)

Cursor项目感知原理:重构编辑器的工程理解能力 现代中大型代码库的复杂性已远超传统编辑器的语义处理边界。项目感知(Project Awareness)并非营销概念,而是指编辑器对跨文件调用链、Git变更上下文、配置语义联动等工程要素的深度建模能力。其技术基础在于AST驱动的符号解析、版本历史注入与结构化配置推导,核心价值是将AI从文本补全工具升级为开发闭环协作者。典型应用场景包括快速定位隐蔽Bug、安全重构遗留模块、生成符合业务规则的代码,以及自动化编写高准确率的技术文档。Cursor正是通过原生集成这三层能力,实现了对VS Code等传统工具在‘工程理 阅读详情

排序

  • 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)

归并排序

  • 该排序属于 分治 策略
  • 将一个问题分解为两个问题来计算,计算完成之后,就会得到子任务的解,这些解不是最终问题的解,还需要merge起来
  • 性能好,火狐的sort方法
  • 思路
    • 分:把数组分成2半,再递归地对子数组进行"分"操作,直到分成一个个单独的数
    • 合:把两个数合并为有序数组,再对有序数组进行合并,直到全部子数组,合并为一个完整数组
      • 两个单独的数组成的数组,也是两个有序数组,这两个数组里都只有1个数
      • 合这个操作,就是不断合并有序数组
    • 如何合并两个有序数组
      • 新建一个空数组res, 用于存放最终排序后的数组
      • 比较两个有序数组的头部,较小者出队并推出res中
      • 如果两个数组还有值,就重复第二步
      • 两个数组都空了,合并完成

Typescript 版算法实现


1 ) 方案1

function mergeSort(nums: number[]) {
    // 1. 内部核心函数
	function msFn(arr:number[]) {
        const len: number = arr.length;
		if (len < 2) return arr;
		const mid: number = Math.floor(len / 2);
		const left: number[] = arr.slice(0, mid);
		const right: number[] = arr.slice(mid);
		const orderLeft: any = msFn(left); // 排好序的左侧
		const orderRight: any = msFn(right); // 排好序的右侧
		const res: number[] = [];
		while(orderLeft.length || orderRight.length) {
			if(orderLeft.length && orderRight.length) {
				res.push(orderLeft[0] < orderRight[0] ? orderLeft.shift() : orderRight.shift());
			} else if (orderLeft.length) {
				res.push(orderLeft.shift());
			} else if(orderRight.length) {
				res.push(orderRight.shift());
			}
		}
		return res;
	}
    // 2. 开始排序
	const result = msFn(nums);
    // 3. 替换原数组
    nums.splice(0, nums.length, ...result);
}

const list: number[] = [5, 4, 3, 2, 1];
mergeSort(list);
console.log(list); // [1, 2, 3, 4, 5]
  • 时间复杂度:O(nlogn)
    • 分:每次把数组分成两半,用时 O(logn), log函数用于求2?2^?2? = n, 自然 ? = log2nlog_2 nlog2​n, 即 O(logn)
      • 注意,凡是分的操作,基本都是logn
    • 合:O(n), 一个while循环体
  • 上述开辟了额外空间, 一般是不推荐的,一般是交换下标 TODO

2 )方案2

function mergeSort(nums: number[]): number[] {
        // 内部核心函数,使用索引进行归并排序
        function msFn(arr: number[], left: number, right: number): number[] {
            if (left >= right) {
                // 如果左索引大于或等于右索引,说明子数组只有一个元素或为空,直接返回该子数组(或空数组)
                return arr.slice(left, right + 1);
            }
    
            const mid = Math.floor((left + right) / 2);
            // 递归排序左右子数组,但这里不直接修改原数组,而是返回排序后的新数组片段
            const leftSorted = msFn(arr, left, mid);
            const rightSorted = msFn(arr, mid + 1, right);
    
            // 合并两个有序数组片段
            const merged: number[] = [];
            let i = 0, j = 0;
            while (i < leftSorted.length && j < rightSorted.length) {
                if (leftSorted[i] < rightSorted[j]) {
                    merged.push(leftSorted[i]);
                    i++;
                } else {
                    merged.push(rightSorted[j]);
                    j++;
                }
            }
            // 将剩余的元素(如果有)添加到合并后的数组中
            return merged.concat(leftSorted.slice(i)).concat(rightSorted.slice(j));
        }
    
        // 开始排序,并获取排序后的新数组
        const sortedArray = msFn(nums, 0, nums.length - 1);
        // 如果你确实需要将排序结果复制回原数组,可以取消下面一行的注释
        // nums.splice(0, nums.length, ...sortedArray);
    
        // 返回排序后的新数组(通常不需要修改原数组)
        return sortedArray;
    }

Python3 版算法实现


1 ) 方案1

def merge_sort(nums):
    def ms_fn(arr):
        arr_len = len(arr)
        if arr_len < 2:
            return arr
        
        mid = arr_len // 2
        left = arr[:mid]
        right = arr[mid:]

        ordered_left = ms_fn(left)  # 排好序的左侧
        ordered_right = ms_fn(right)  # 排好序的右侧

        res = []
        while ordered_left and ordered_right:
            if ordered_left[0] <= ordered_right[0]:
                res.append(ordered_left.pop(0))
            else:
                res.append(ordered_right.pop(0))

        # 将剩余元素添加到结果中
        res.extend(ordered_left)
        res.extend(ordered_right)

        return res
    
    nums[:] = ms_fn(nums)  # 替换原数组内容

# 测试代码
if __name__ == "__main__":
    test_list = [5, 4, 3, 2, 1]
    print("原始列表:", test_list)
    merge_sort(test_list)
    print("排序后列表:", test_list)

2 )方案2

def merge_sort(nums):
    # 内部核心函数,使用索引进行归并排序
    def ms_fn(arr, left, right):
        if left >= right:
            # 如果左索引大于或等于右索引,说明子数组只有一个元素或为空,直接返回
            return
        
        mid = (left + right) // 2
        # 递归排序左右子数组
        ms_fn(arr, left, mid)
        ms_fn(arr, mid + 1, right)

        # 合并两个有序数组片段
        merge(arr, left, mid, right)

    # 合并两个有序的子数组为一个有序数组
    def merge(arr, left, mid, right):
        temp = []
        i, j = left, mid + 1

        # 合并两个有序数组
        while i <= mid and j <= right:
            if arr[i] <= arr[j]:
                temp.append(arr[i])
                i += 1
            else:
                temp.append(arr[j])
                j += 1
        
        # 将剩余的元素添加到临时列表中
        temp.extend(arr[i:mid + 1])
        temp.extend(arr[j:right + 1])

        # 将临时列表中的元素复制回原列表
        for k in range(len(temp)):
            arr[left + k] = temp[k]

    # 开始排序
    ms_fn(nums, 0, len(nums) - 1)

# 示例用法
if __name__ == "__main__":
    # 测试代码
    list_ = [5, 4, 3, 2, 1]
    merge_sort(list_)
    print(list_)  # 输出:[1, 2, 3, 4, 5]

Golang 版算法实现


1 ) 方案1

package main

import "fmt"

// mergeSort 对给定的整数切片进行归并排序
func mergeSort(nums []int) {
	// 内部核心函数
	var msFn func([]int) []int
	msFn = func(arr []int) []int {
		arrLen := len(arr) // 使用不同的变量名来存储长度
		if arrLen < 2 {
			return arr
		}
		mid := arrLen / 2
		left := arr[:mid]
		right := arr[mid:]

		orderLeft := msFn(left)  // 排好序的左侧
		orderRight := msFn(right) // 排好序的右侧

		res := make([]int, 0, arrLen)

		for len(orderLeft) > 0 && len(orderRight) > 0 {
			if orderLeft[0] < orderRight[0] {
				res = append(res, orderLeft[0])
				orderLeft = orderLeft[1:]
			} else {
				res = append(res, orderRight[0])
				orderRight = orderRight[1:]
			}
		}

		// 将剩余元素添加到结果中
		res = append(res, orderLeft...)
		res = append(res, orderRight...)

		return res
	}

	// 开始排序
	result := msFn(nums)
	// 替换原数组内容
	copy(nums, result)
}

func main() {
	list := []int{5, 4, 3, 2, 1}
	mergeSort(list)
	fmt.Println(list) // 输出:[1 2 3 4 5]
}

2 ) 方案2

package main

import "fmt"

// mergeSort 对给定的整数切片进行归并排序
func mergeSort(nums []int) {
	// 内部核心函数,使用索引进行归并排序
	var msFn func(arr []int, left, right int)
	msFn = func(arr []int, left, right int) {
		if left >= right {
			// 如果左索引大于或等于右索引,说明子数组只有一个元素或为空,直接返回
			return
		}

		mid := (left + right) / 2
		// 递归排序左右子数组
		msFn(arr, left, mid)
		msFn(arr, mid+1, right)

		// 合并两个有序数组片段
		merge(arr, left, mid, right)
	}

	// 开始排序
	msFn(nums, 0, len(nums)-1)
}

// merge 将两个有序的子数组合并为一个有序数组
func merge(arr []int, left, mid, right int) {
	// 创建临时数组存储合并结果
	temp := make([]int, right-left+1)
	i, j, k := left, mid+1, 0

	// 合并两个有序数组
	for i <= mid && j <= right {
		if arr[i] <= arr[j] {
			temp[k] = arr[i]
			i++
		} else {
			temp[k] = arr[j]
			j++
		}
		k++
	}

	// 将剩余的元素添加到临时数组中
	for i <= mid {
		temp[k] = arr[i]
		i++
		k++
	}
	for j <= right {
		temp[k] = arr[j]
		j++
		k++
	}

	// 将临时数组中的元素复制回原数组
	copy(arr[left:right+1], temp)
}

func main() {
	list := []int{5, 4, 3, 2, 1}
	mergeSort(list)
	fmt.Println(list) // 输出:[1 2 3 4 5]
}
【AI编程】Cursor Tab功能实战:从代码补全到智能重构的进阶指南 本文深入解析Cursor编辑器的Tab功能,从代码补全到智能重构的全面指南。通过实战案例展示如何利用AI编程提升开发效率,包括注释生成代码、跨文件协调、类型推导等高级技巧,帮助开发者快速掌握这一革命性工具。 阅读详情

相关推荐

超越Pandas:Polars、DuckDB与Vaex实战指南

在现代数据工程中,Pandas作为交互式分析利器广受欢迎,但其全内存、单线程设计在处理千万行以上数据、宽表JOIN、实时特征计算等场景时易引发OOM、高延迟与协作瓶颈。理解列式计算、惰性求值、内存映射等核心原理,是迈向可扩展、可审计、可运维的数据流水线的关键。Polars以Rust引擎实现向量化执行与查询优化,DuckDB将嵌入式OLAP能力带入Python进程,Vaex则通过内存映射支持超大规模时序数据探索——三者共同构成‘分析即代码’落地的轻量级技术栈。本文聚焦金融风控、电商宽表、IoT时序三大高频场景

weixin_30652491的博客 509

GitHub 汉化完整指南:导入 1 个脚本,3 分钟把界面变中文

想中文阅读 GitHub,又怕浏览器翻译把代码和布局搅乱?github-chinese(GitHub 汉化插件)给出答案:导入一个 Tampermonkey 脚本,界面即刻中文化,全程零配置,不用碰任何选项。 ## 🔍 装上 GitHub 汉化插件后,你会看到什么 打开 GitHub 首页,顶部导航变成"仪表板""置顶仓库";进入仓库页,菜单是"代码、议题、拉取请求",按钮变成"星标""复刻

gitblog_00311的博客 753

【信息科学与工程学】【数据科学】第一百二十二篇 大数据产品中的函数与算法01

它通常指。下面按照你给出的表格列💡 说明:下表中的"产品"以开源/主流商业组件为具象载体(Hadoop、Spark、Flink、Kafka、Hive、HBase、Iceberg、Atlas、Ranger、TensorFlow 等),它们共同构成一个完整的大数据产品家族;代码为实现示例,用于说明算法在工程系统中的落地方式。

weixin_49199313的博客 200

数据结构与算法之排序: LeetCode 21. 合并两个有序链表 (Ts, Py, Go版)

1 )遍历两个链表,依次比较存入结果链表。2 )递归

Wang的专栏 530

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计02

编号类型模型配方企业资本运作的方法/规则/条件/依据及所有的步骤(​风险处理/异常处理/危机应对关联知识法律法规和裁决依据​​由发起人(通常是知名投资人、投行或产业资本)先设立一个只有现金、无实际业务的特殊目的收购公司(SPAC),通过IPO募集资金并在交易所上市。然后在规定时间内(通常24个月)寻找一家非上市公司进行合并(De-SPAC),使目标公司迅速实现上市,规避传统IPO的复杂流程和不确定性。1.:在开曼或特拉华注册空壳公司,注入少量种子资金。2.

weixin_49199313的博客 317

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2493

leetCode解题记录4 - 寻找两个有序数组的中位数(JS, TS, PY版)

作者:陈大鱼头 项目地址:ying-leetcode 碎碎念:Mmmmm,不定期刷leetcode,会以JS TS PY的形式输出出来 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = ...

鱼头的Web海洋 1114

从零到一:Gromacs伞形采样的实战避坑指南

本文详细介绍了Gromacs伞形采样技术的实战应用与避坑指南,涵盖核心原理、环境准备、参数设置、数据分析及性能优化等关键环节。特别针对蛋白质-配体结合自由能计算等典型应用场景,提供了弹簧常数设置、采样窗口间距等实用参数建议,帮助研究人员高效完成分子动力学模拟。

weixin_29243279的博客 517

7种排序算法动画详解:从冒泡到堆排序的实战指南

排序算法是编程基础中的核心知识,也是面试和实际开发中频繁使用的技能。《Hello 算法》项目提供了动画图解、一键运行的数据结构与算法教程,支持 Java, C++, Python 等多种语言,帮助开发者直观理解排序算法的工作原理。本文将通过动画图解方式,详细解析7种常用排序算法的实现过程、优缺点及适用场景,让你轻松掌握排序算法的精髓。 ## 排序算法概览:选择最适合你的排序方案 🚀 排序算法

gitblog_00974的博客 531

AIDD-人工智能药物设计-构建基于机器学习方法的在线预测平台高准确预测药物诱导骨毒性

在此基础上,提取多种药物分子特征,包括分子指纹(如MACCS、Morgan、RDKit、TopologicalTorsion、AtomPairs与Descriptors)及分子图谱,通过Transformer编码器与神经网络进行机器学习模型训练。最后,将训练好的模型部署为在线Web服务器(BoneToxPD),供用户快速预测药物的骨毒性。本研究不仅在骨毒性预测的准确性方面取得了突破,还在模型解释性方面提供了新的视角,通过注意力机制精准识别出影响骨毒性的关键化学基团,推动药物研发领域更安全、更高效的发展。

itwangyang520的博客 1082

STM32F407+LWIP实战:手把手教你移植mbedtls库实现Modbus TCP双向认证

本文详细介绍了如何在STM32F407微控制器上移植mbedtls库,结合LWIP协议栈实现Modbus TCP的双向认证功能。通过TLS 1.2加密通道,有效提升工业物联网通信的数据安全性,涵盖证书管理、内存优化及性能调优等关键步骤,为嵌入式系统开发者提供了一套完整的解决方案。

weixin_28721917的博客 517

rdpwrap.ini:Windows 更新后三步恢复多用户远程桌面(含 1400+ 构建补丁)

rdpwrap.ini 是 RDP Wrapper Library 的核心配置文件,为家庭版、专业版 Windows 提供多用户远程桌面方案。每次系统更新替换 termsrv.dll 后,旧补丁偏移即失效,本仓库持续跟进新构建。下文给出恢复与长期维护的做法。 ## rdpwrap.ini 结构速览:每一段配置各管哪一层 这一节回答"这个文件到底对系统动了什么"。整份 [rdpwrap.ini]

gitblog_00740的博客 445

OPENSSL使用方法

预备知识KEY 通常指私钥。CSR 是 Certificate Signing Request 的缩写,即证书签名请求,这不是证书,只是包含申请证书的基本信息。生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。CRT 即 certificate的缩写,即证书。 X.509 是一种证书格式。对X.509证书来说,认证者总是CA或由CA指定的人,一份...

zxm8513优快云博客 1216

50个必知必会算法实战指南:多语言实现深度解析

Algo项目是一个专注于数据结构和算法实践的开源库,提供了50个核心算法的多语言实现方案。这个项目由前Google工程师创建,旨在帮助开发者通过实际代码掌握算法精髓,提升编程面试和工程实践能力。项目覆盖从基础数据结构到高级算法的完整知识体系,支持C/C++、Java、Python、Go、JavaScript、TypeScript、Rust、Scala、Swift、Kotlin、PHP、Object

gitblog_00311的博客 498

RAG 提示词工程最佳实践

虽然目前网络上关于提示工程的相关资料已经多如牛毛,然而 RAG (检索增强生成) 任务中提示工程如何进行的资料相对而言却较少。不少朋友之前也热烈的讨论过 RAG 场景下提示词的运用,因此 Zen 禅与计算机程序设计艺术 特别推出 RAG 任务下的提示词实践经验系列分享。RAG 是检索增强生成(Retrieval Augmented Generation)的简称,是当前最火热的企业级LLM应用方案。

AI天才研究院 2014

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

算法大师! 630

解密晶格数据结构:Anna KVS如何用数学原理解决分布式一致性难题

在分布式系统中,数据一致性是开发者面临的核心挑战。当多个节点同时读写数据时,如何确保结果的正确性和可靠性?GitHub加速计划旗下的Anna项目——一个低延迟云原生键值存储(KVS),创新性地引入**晶格数据结构**(Lattice Data Structures),通过数学原理优雅解决了这一难题。本文将深入解析Anna KVS如何利用晶格的幂等性、交换性和结合性,实现高效的分布式数据同步与冲突解

gitblog_00557的博客 809

【船舶】风浪流模型水面船舶三自由度运动仿真【含Matlab源码 4379期】

风浪流模型水面船舶三自由度运动仿真 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 696

7个分布式算法优化技巧,让边缘计算效率提升300% | Hello Algorithm实战

你还在为边缘设备算力不足、数据处理延迟高而烦恼吗?当智能家居、工业物联网等场景中数百个边缘节点同时运行时,传统集中式算法往往力不从心。本文将通过《Hello 算法》中的7个核心优化技巧,教你如何将基础算法改造为分布式计算引擎,让边缘节点的处理效率实现质的飞跃。读完本文你将掌握:分布式任务拆分策略、节点通信优化、数据分片技术、故障容错机制、资源动态调度、能耗控制算法以及性能监控方案。 ## 边缘计...

gitblog_00162的博客 1016

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

从Easy到Hard:LeetCode Solutions分难度刷题计划(附878道Easy题解)

LeetCode作为全球最受欢迎的算法练习平台之一,拥有超过2000道题目,覆盖从基础到进阶的各类算法知识点。对于新手而言,直接挑战高难度题目容易产生挫败感,而分难度刷题能帮助你循序渐进地构建算法思维。本项目(LeetCode Solutions)提供了**C++20/Java/Python/MySQL/TypeScript**五种语言的题解,其中**Easy难度题目达878道**,是入门者的理想

gitblog_00193的博客 669

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ClaudeCode深度指南:从安装配置到高阶技巧,打造你的AI编程助手

大型语言模型(LLM)正深度融入软件开发工作流,其核心原理是通过海量代码和文本训练,实现对编程语言、框架和逻辑的深度理解。这项技术的工程价值在于将AI的代码生成、解释和调试能力无缝嵌入开发环境,极大提升了开发效率与探索能力。在实际应用中,开发者可通过集成工具,将LLM作为实时编程伙伴,用于代码补全、重构、技术方案评审和文档生成等场景。本文聚焦于ClaudeCode这一第三方工具集合,它通过提供VSCode插件和独立桌面应用两种形态,实现了与Claude、Ollama本地模型及DeepSeek等国内大模型AP

weixin_33748818的博客 425

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374

数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

农夫、羊、狼、菜的过河问题 问题描述 角色:农夫,羊,狼,菜 条件1:船很小,只能装下农夫和其他一个角色 条件2:无人看管,羊吃菜,狼吃羊 问:如何让其他三种角色被农夫平安带着过河? 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 ) 先渡狼,人回来再渡菜,人回来再渡羊 2 ) 先渡菜,人回来再渡狼,人回来再渡羊 以上两种很好想到,而且我们可以知道羊这种角色是不能先渡河过去的,羊需要最后再渡 如果先渡了羊了,之后再渡任何其他角色,都要将羊带回来 可以参考小游戏:http://gameschool

Wang的专栏 3314

数据结构与算法笔记:图搜索之DFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) !!!本文详解!!! 深度优先搜索DFS 深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 同样,我们可以通过一个故事来开始 在古希腊神话中, Ariadne是Crete的国王Minos的公主,她给忒修斯(Theseus)一个线团 使得忒修斯成功进入迷宫杀死牛头怪兽,但事后忒修斯抛弃了她 这是一个有道德意义的故事又或者存在不同的版本, 但不是我们的研究的对象

Wang的专栏 3119

数据结构与算法笔记:计算思维之人鬼渡河问题

人鬼渡河问题 1 ) 问题描述 目标:将东岸的3人3鬼通过一只小船安全转移到西岸,希望摆渡次数尽可能少 条件 船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼) 无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人将被鬼吃掉 怎样渡河的大权掌握在人的手中 说明:划船的时间忽略不计。船一靠岸即将船与岸视为一体,人和鬼即使还没有下 船也视为已上岸 任务:编写程序,求出一种渡河方案 备注:图片托管于github,请确保网络的可访问性 2 ) 分析 目标是找

Wang的专栏 2447
上一篇: 数据结构与算法之排序: 插入排序 (Ts, Py, Go版)
下一篇: 数据结构与算法之排序: 选择排序 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值