第四章快速排序——分而治之

news2024/9/20 22:54:38

分而治之(divide and conquer,D&C)

在这里插入图片描述
在这里插入图片描述
D&C算法是递归的,并且有2个步骤:

  1. 找出基线条件,并且条件尽可能简单
  2. 不断将问题分解,直到符合基线条件

给定一个数组,求和:
在这里插入图片描述
利用循环很容易,递归该如何做呢?

  1. 找基线条件:
    在这里插入图片描述

  2. 缩小规模
    在这里插入图片描述
    在这里插入图片描述

func total(nums []int)int{
	if len(nums)==0{
		return 0
	}else if len(nums)==1{
		return nums[0]
	}else{
		return nums[0]+total(nums[1:])
	}
}

快速排序

C语言标准库qsort中使用的就是快排,快排使用的就是D&C思想

  1. 数组为空或者只有一个元素时,根本不用排序,直接返回即可
    在这里插入图片描述
  2. 选择一个基准值,以数组第一个元素为例,找出比基准值大和小的元素
    在这里插入图片描述
  3. 对左右两边的子数组快速排序,然后合并就是排序好的数组
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

func GetNewArr(target int,nums []int,greater bool)[]int{
	length:=len(nums)
	result:=make([]int,0,length)
	if greater{
		// 大
		for i:=0;i<length;i++{
			if nums[i]>target{
				result=append(result,nums[i])
			}
		}
	}else{
		// 小
		for i:=0;i<length;i++{
			if nums[i]<=target{
				result = append(result,nums[i])
			}
		}
	}
	return result
}

func Join(args...[]int)[]int{
	if len(args)==0{
		return []int{}
	}else{
		result:=make([]int,0,len(args[0]))
		for _,val:=range args{
			result=append(result,val...)
		}
		return result
	}
}

func quickSort(nums []int)[]int{
	if len(nums)==0 || len(nums)==1{
		return nums
	}else{
		target:=nums[0]
		less:= GetNewArr(target,nums[1:],false)
		greater:= GetNewArr(target,nums[1:],true)
		return Join(quickSort(less),[]int{target},quickSort(greater))
	}
}

平均情况和最糟情况

快排的性能高度依赖基准值,在最坏情况下快排的时间复杂度为O(n**2),而平均情况下快排的时间复杂度为O(n*logn)

  1. 最坏情况,栈长为n

在这里插入图片描述
2. 最佳情况,栈长为logn
在这里插入图片描述
不管哪种情况,调用栈每层都需要遍历每一个元素,从而找到大于基准值和小于基准值的数组,所以为O(n)

在这里插入图片描述
在这里插入图片描述

func GetNewArr(target int,nums []int,greater bool)[]int{
	length:=len(nums)
	result:=make([]int,0,length)
	if greater{
		// 大
		for i:=0;i<length;i++{
			if nums[i]>target{
				result=append(result,nums[i])
			}
		}
	}else{
		// 小
		for i:=0;i<length;i++{
			if nums[i]<=target{
				result = append(result,nums[i])
			}
		}
	}
	return result
}

func Join(args...[]int)[]int{
	if len(args)==0{
		return []int{}
	}else{
		result:=make([]int,0,len(args[0]))
		for _,val:=range args{
			result=append(result,val...)
		}
		return result
	}
}

func quickSort(nums []int)[]int{
	if len(nums)==0 || len(nums)==1{
		return nums
	}else{
		index:=rand.Intn(len(nums))
		target:=nums[index]
		nums = append(nums[:index],nums[index+1:]...)
		less:= GetNewArr(target,nums,false)
		greater:= GetNewArr(target,nums,true)
		return Join(quickSort(less),[]int{target},quickSort(greater))
	}
}

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

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

相关文章

秒懂双向链表

目录 一、双向链表概述 二、模拟实现双向链表 1、头插法插入元素 2、尾插法插入元素 3、在指定位置插入元素 4、查询双向链表中是否包含key 5、删除第一次出现关键字为key的结点 6、删除所有值为key的结点 7、求双向链表的长度 8、遍历双向链表 9、清空双向链表 三…

【 uniapp - 黑马优购 | 商品列表 】如何实现数据获取、结构渲染、自定义组件的封装

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

在 Mac 上将 PDF 转换为 Word 的 5 种简单方法

当谈到将PDF格式转换为Word格式时&#xff0c;用户可能会从互联网上搜索并尝试在线将PDF转换为Word。如果是这样&#xff0c;您可能会得到不好的结果并冒着文件本身的风险。在线 PDF 到 Word 转换器工具可能会产生低质量的输出&#xff0c;对文件大小有限制&#xff0c;更糟糕的…

maven多模块依赖版本不一致问题

项目结构&#xff1a; ├─springcloud-alibaba ├─.idea├─shop-common├─shop-order├─shop-product└─shop-user项目环境&#xff1a; 父工程&#xff1a; <properties><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version><sprin…

java虚拟机之垃圾回收机制

一.需要回收的内存区域 程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生灭(因为是线程私有)&#xff0c;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。而 Java 堆和方法区则不一样&#xff0c;一个接口中的多个实现类需要的内存可能不一样&#xff0c…

<Focal Loss for Dense Object Detection>论文解读

目录1.简介2.模型2.1 二阶段要比单阶段模型效果好本质原因2.2 模型结构2.3.focal loss2.3.1 公式说明2.3.2 其他2.4 消融实验3.源码详解1.简介 目标识别有两大经典结构: 第一类是以Faster RCNN为代表的二阶段识别方法&#xff0c;这种结构的第一阶段专注于proposal的提取&am…

后端开发规约

目录 项目MVC层级设计规范 工程项目模块设计 设计规约 Java编码规范 参考《阿里巴巴Java开发手册》&#xff0c;见文末参考文档 OOP 面向对象设计 & 面向接口编程 Lombok工具包依赖 Guava、Hutool 等脚手架工具包&#xff08;三方包使用其一即可&#xff09; 日志打…

python初级教程十 Mongodb增、删、改、查

Mongodb 插入文档 MongoDB 中的一个文档类似 SQL 表中的一条记录。 插入集合 集合中插入文档使用 insert_one() 方法&#xff0c;该方法的第一参数是字典 name > value 对。 以下实例向 sites 集合中插入文档&#xff1a; #!/usr/bin/python3import pymongomyclient p…

03、Java并发 Java 线程池 ( Thread Pool ) (上)

本文我们将讲解 Java 中的线程池 ( Thread Pool )&#xff0c;从 Java 标准库中的线程池的不同实现开始&#xff0c;到 Google 开发的 Guava 库的前世今生。 本章节涉及到很多前几个章节中阐述的知识点。我们希望你是按照顺序阅读下来的&#xff0c;不然有些知识会一头雾水。 J…

Redis基础篇——Redis安装以及配置文件的修改

文章目录1. 认识Redis1.1 特征1.2 安装 Redis1. 安装 Redis 依赖2. 上传安装包1.3 默认启动1.4 指定配置启动1.5 开机自启&#xff08;推荐&#xff09;1. 认识Redis Redis 诞生于 2009 年&#xff0c;全称是 Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;…

Databend 开源周报 #73

Databend 是一款强大的云数仓。专为弹性和高效设计&#xff0c;自由且开源。 即刻体验云服务&#xff1a;https://app.databend.com。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements Multiple Catalogs …

hudi实战-- 核心点解析

目录 Hudi 基础功能 Hudi 简介 Hudi 功能 Hudi 的特性 Hudi 的 架构 Hudi 数据管理 Hudi 表数据结构 hoodie 文件 数据文件 数据存储概述 Metadata 元数据 Index 索引 索引策略 Data 数据 Hudi 核心点解析 基本概念 时间轴Timeline 文件管理 索引 Index 表的存储…

NiN详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ https://github.com/tt-s-t/Deep-Learning.git 目录 一、NiN网络的…

【C语言开源库】 一个只有500行代码的开源http服务器:Tinyhttpd学习

项目搬运&#xff0c;带中文翻译&#xff1a;https://github.com/nengm/Tinyhttpd在嵌入式中&#xff0c;我们HTTP服务器用得最多的就是boa还有就是goahead,但是这2个代码量比较大&#xff0c;而Tinyhttpd只有几百行&#xff0c;比较有助于我们学习。一、编译及运行直接make之后…

用Python让奇怪的想法变成现实,2023年继续创作

2023年继续写作&#xff0c;用文章记录生活 时间过得真快&#xff0c;一下就到2023年了。 由于疫情肆虐&#xff0c;在网络的游弋的实现也长了&#xff0c;写作的自然也多了。 回想一下&#xff0c;2018-2021年这三年时间里一篇文章也没写过为0&#xff0c;哈哈&#xff0c;没…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + NVISTAR VP300 激光雷达 评测

简介&#xff1a;介绍NVISTAR 的二维DTOF激光雷达 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melodic。…

滴滴前端一面经典手写面试题

实现bind 实现bind要做什么 返回一个函数&#xff0c;绑定this&#xff0c;传递预置参数bind返回的函数可以作为构造函数使用。故作为构造函数时应使得this失效&#xff0c;但是传入的参数依然有效 // mdn的实现 if (!Function.prototype.bind) {Function.prototype.bind f…

Kuberneters(2)- Pod详解

第四章 实战入门 本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 Namespace ​ Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 ​ 默认情况下&…

路由跳转同一个界面,但是params不同。页面不刷新?(路由的key)

文章目录引入知识点&#xff1a;路由的key值思路&#xff1a;结论&#xff1a;解决方法&#xff1a;效果&#xff1a;应用场景:引入知识点&#xff1a;路由的key值 如果不设置路由的key值&#xff0c;默认情况下是根据路径判断的&#xff0c;就是不包括params值 例子&#xff…

MySQL5-数据类型

目录 1.数值类型&#xff08;分为整型和浮点型&#xff09; 2.字符串类型 3.日期类型 MySQL和Java编程一样&#xff0c;创建表时要考虑数据类型。 MySQL表组成&#xff1a;列名/列数据类型&#xff1b;数据。 1.数值类型&#xff08;分为整型和浮点型&#xff09; 数据类型…