go 语言实现快速排序

news2024/9/24 13:14:08

快速排序 - go

  • 一、思路
  • 二、步骤及图解
  • 三、代码实现
  • 四、复杂度分析

一、思路

  快速排序是一种分治策略的排序算法,关键过程是对数组进行划分。选择一个基准值(pivot element),围绕着这个基准值划分子数组,对子数组递归调用快速排序,直到数组有序。

二、步骤及图解

1、选取基准元素。将最后一个元素(随机值、三数中值) 作为基准值 pivot。
2、划分子数组。遍历数组,将小于基准值的元素交换到左边,大于基准值的元素交换到右边,将基准值交换到正确的位置,并返回其索引作为分区点。经过这一步骤之后,数组被划分成小于和大于基准值的2个子数组。
3、递归调用。递归地对这2个子数组进行快速排序,直到整个数组有序。

  • 一次快速排序的过程

在这里插入图片描述

  • 快速排序全过程

在这里插入图片描述

  • 数组变化

在这里插入图片描述

三、代码实现

package main

import "fmt"

func main() {
	arr := []int{10, 8, 3, 9, 7, 1, 2, 5}
	quickSort(arr, 0, len(arr)-1)
	fmt.Println("Sorted array:", arr) // Sorted array: [1 2 3 5 7 8 9 10]
}

// left,right分别为数组的最左、最右下标
func quickSort(arr []int, left, right int) {
	if left >= right { // 递归截止条件
		return
	}
	pivot := partition(arr, left, right)
	quickSort(arr, left, pivot-1)
	quickSort(arr, pivot+1, right)
}

// 分区函数
func partition(arr []int, left, right int) int {
	pivot := arr[right] // 选择数组的最后一个元素作为基准值
	i := left           // 数组最左元素的下标
	for j := left; j < right; j++ {
		if arr[j] < pivot { // 将小于基准值的元素交换到左边
			arr[i], arr[j] = arr[j], arr[i]
			i++
		}
	}
	// 处理基准值
	arr[i], arr[right] = arr[right], arr[i]
	return i
}

// 空间复杂度:O(1), 在分区时使用原地交换的方式

四、复杂度分析

  • 时间复杂度:O(n log n)
      快速排序的时间复杂度可以通过递归树来分析。在每一层中,我们选择一个主元素并将数组划分为两个子数组,时间复杂度为O(n)。如果我们将递归树表示为二叉树,则总共有 log n 层,并且每层的时间复杂度为 O(n),因此整个算法的时间复杂度为 O(n log n)。

以下情况快速排序的时间复杂度将退化为 O(n^2):
  1、数组已经有序。在待排序数组已经有序的情况下,每次划分只能减少一个元素,时间复杂度将退化为 O(n^2)。
  2、基准值有问题。选择的基准值不能把数组分区成均衡的两部分,基准值都是最小或最大的元素,导致每次分区后,一个子数组为空,而另一个子数组包含剩余的所有元素,时间复杂度将退化为O(n^2)。

  • 空间复杂度:O(log n)
      快速排序的空间复杂度主要由递归调用栈决定。在最好的情况下(即每次分区都非常平衡),递归深度为 log n,因此空间复杂度为 O(log n)。

  在最坏的情况下(即每次分区都极度不平衡),递归深度可以达到 n,空间复杂度将退化为 O(n)。

  快速排序是不稳定的排序算法,因为在排序过程中会涉及到交换操作,可能导致相同元素的相对顺序发生变化。

  然而,有时候也可以通过一些技巧使得快排变成稳定排序。例如,在选择主元素时,可以选择第一个或最后一个元素,这样就可以避免在分区过程中出现相同元素的前后位置发生变化的情况。

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

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

相关文章

CyberVadis认证流程

1. 评估现有安全实践&#xff1a;组织需要对其现有的安全实践进行全面评估&#xff0c;包括安全策略、技术架构、人员安全意识等。 2. 确定目标&#xff1a;根据组织的需求和目标&#xff0c;确定需要改进的领域和优先级。 3. 制定计划&#xff1a;制定详细的认证计划&#x…

在 Windows 上开发.NET MAUI 应用_2.生成你的第一个应用

先决条件 Visual Studio 2022 17.8 或更高版本&#xff0c;并安装了 .NET Multi-platform App UI 工作负载。 可参考上一篇文章&#xff1a;http://t.csdnimg.cn/n38Yy 创建应用 1.启动 Visual Studio 2022。 在开始窗口中&#xff0c;单击“创建新项目”以创建新项目&#…

美式键盘 QWERTY 布局的来历

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…

黑马头条Day02-app端文章查看,静态化freemarker

学习内容&#xff1a; 一、app端文章列表 1. 需求分析 文章的布局展示 2. 导入文章数据库 可以使用IDEA的数据库连接工具执行SQL脚本 3. 表结构分析 ap_article文章基本信息表 ap_article_config文章配置表 ap_article_content文章内容表 把课前资料里提供的实体类复制到mod…

转移C盘中的conda环境(包括.condarc文件修改,environment.txt文件修改,conda报错)

conda环境一般是默认安装到C盘的&#xff0c;若建立多个虚拟环境&#xff0c;时间长了&#xff0c;容易让本不富裕的C盘更加雪上加霜&#xff0c;下面给出将conda环境从C盘转移到D盘的方法。 目录 电脑软硬件转移方法查看当前conda目录转移操作第一步&#xff1a;.condarc文件修…

vmware虚拟机中,Centos安装Docker,解决国内无法访问

背景 本文主要解决了centos 的yum源 无法更新 和 docker的 源 国内无法访问的问题。 本文环境&#xff1a;windows宿主机装了vmware虚拟机&#xff0c;虚拟机中安装了Centos&#xff0c;centos内装docker。其实可以直接在window装docker desktop for windows&#xff0c;但…

ns3-gym入门(三):在opengym基础上实现一个小小的demo

因为官方给的"opengym""opengym-2"这两个例子都很简单&#xff0c;所以自己改了一个demo&#xff0c;把reward-action-state相互影响的关系表现出来 一、准备工作 在ns3.35/scratch目录下创建一个文件夹&#xff1a; &#xff08;后续的运行指令后面都需要…

JVM---对象是否存活及被引用的状态

1.如何判断对象是否存活 1.1 引用计数算法 概念&#xff1a;在对象头部增加一个引用计数器,每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 优点&#xff1…

喰星云·数字化餐饮服务系统 多处 SQL注入漏洞复现

0x01 产品简介 喰星云数字化餐饮服务系统是一款专为餐饮企业设计的综合性管理软件,旨在通过信息化手段提升餐饮企业的运营效率、降低运营成本,并实现数据驱动的决策管理。该系统包括供应链管理、财务管理、巡店管理、人力资源管理等多个模块,可全面覆盖餐饮企业的日常运营需…

【多线程综合】java何时考虑线程安全问题、怎么考虑、又怎么解决?

前言&#xff1a;在编程中&#xff0c;线程安全是一个非常重要的概念。它涉及到多个线程并发访问共享资源时的正确性和一致性。在Java中&#xff0c;为了确保线程安全&#xff0c;我们需要考虑一些关键因素。 1、什么是线程安全 线程安全是指当多个线程同时访问一个对象时&am…

十大排序 之 快速排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想&#xff0c;即在一个无序的序列中选取一个任意的基准元素base&#xff0c;利用base将待排序的序列分…

基于RK3588的8K视频解码显示案例分享!引领超高清工业视频时代

8K、4K、2K显示对比 2K分辨率&#xff1a;也称为全高清&#xff08;FULL HD&#xff09;&#xff0c;它具有1920 x 1080像素的分辨率。这是目前大多数消费者电视和电脑显示器的标准分辨率&#xff0c;可以提供良好的图像质量。 4K分辨率&#xff1a;也称为4K超高清&#xff0…

我无法给博客园出钱,那我就出点建议吧

相信这张图大家都已经看见过了&#xff0c;从去年就传出博客园经营困难的情况&#xff0c;其实很多平台&#xff0c;不止是博客园&#xff0c;包括现在国内的很多公司都一样&#xff0c;经营是一件大难题&#xff0c;但很多公司我们不知道&#xff0c;悄无声息的倒下了。而博客…

【雅思备考IELTS】写作第一部分Writing Part One

Tips for IELTS Writing (Part 1) By James Lee 2024/7/15 Part 1: 图表数据分析 Analysis of a Graph / Chart / Curve, etc. 这部分一般是让分析一张图表&#xff08;Graph或Chart&#xff09;&#xff0c;用时约20分钟&#xff0c;字数不用太多&#xff0c;150词以上即可。…

推荐一个可以体验正版ChatGPT的平台

在鱼龙混杂的API市场&#xff0c;智创聚合API以其卓越的性能和创新的服务理念&#xff0c;为用户带来了前所未有的体验。我们自豪地宣布&#xff0c;现在加入我们的限时官方API渠道&#xff0c;您将享受到更快速率提升&#xff0c;以及更高质量的回复服务&#xff0c;而这些仅需…

Python酷库之旅-第三方库Pandas(028)

目录 一、用法精讲 71、pandas.tseries.api.guess_datetime_format函数 71-1、语法 71-2、参数 71-3、功能 71-4、返回值 71-5、说明 71-6、用法 71-6-1、数据准备 71-6-2、代码示例 71-6-3、结果输出 72、pandas.util.hash_array函数 72-1、语法 72-2、参数 72…

【PostgreSQL】PostgreSQL简史

博主介绍&#xff1a;✌全网粉丝20W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

Java SHA-256哈希算法

一、SHA-256算法简介 SHA-2&#xff08;Secure Hash Algorithm 2&#xff09;&#xff0c;一种散列函数算法标准&#xff0c;由美国国家安全局研发&#xff0c;由美国国家标准与技术研究院&#xff08;NIST&#xff09;在2001年发布&#xff0c;属于SHA算法之一&#xff0c;是…

C++ std::lock_guard和 std::unique_lock

二者都是 C 标准库中用于管理互斥锁&#xff08;mutex&#xff09;的 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制的类。这些类可以确保互斥锁在构造时被获取&#xff0c;在析构时被释放&#xff0c;从而避免死锁和资源泄漏问题。不过&#xff0c…

使用windows批量解压和布局ImageNet ISLVRC2012数据集

使用的系统是windows&#xff0c;找到的解压命令很多都linux系统中的&#xff0c;为了能在windows系统下使用&#xff0c;因此下载Git这个软件&#xff0c;在其中的Git Bash中使用以下命令&#xff0c;因为Git Bash集成了很多linux的命令&#xff0c;方便我们的使用。 ImageNe…