5-快速排序

2023-11-08

假设有下面这样一排数据需要排序:
3 7 6 1 2 9 1 2 6
排开常用的冒泡和选择排序,今天我们来试一下一种新的方法:快速排序
快速排序的思路如下:

  1. 首先我们要先从这组数据中选出一个任意值X,然后以X为分界,比X小的数据排到X的左半边,比X大的数据排到X的右半边。
  2. 然后我们会得到两边数据,并且左边的比X小或等于X,右边的比X大或等于X,然后我们再将这两组数据进行与上面相同的操作,直至分到只有一个数据。因为都是相同的思路,这里我们可以采用递归操作,直至分为单个数据(此时是递归最开始的位置)。
    在这里插入图片描述

我们来看看最重要的部分,就是如何分出数据左边和右边。这里我们采用设计两个指针,一个从数组左边开始向右走,一个从数组右边向左走。首先左边指针先走,走到它指向的数据大于X,这个指针停下,然后右边指针向左走。如果右边指针指向的数据小于X,则右边指针也停下,两个指针数据交换。然后重复上面过程,直至两指针相交。因为我们是选择先移动指针,再判断大小,所以这里为了方便操作,两个指针选择从两端外开始。下面为第一次互换中,指针的移动历程
在这里插入图片描述
多次互换后,我们可以得到一次成功分开数组过程中的每次交换后的数组状态:
在这里插入图片描述

下面是代码的实现:

//快速排序

#include<stdio.h>

void quick_sort(int arr[], int l, int r)
{
	if (l == r)
		return;
	int x = arr[l], i = l - 1, j = r + 1;
	//每一个数组划分交换过程
	while (i < j)
	{
	    //左指针右移
		while (arr[++i] < x)
			;
		//右指针左移
		while (arr[--j] > x)
			;
		//交换
		if (i < j)
		{
			int tmp = 0;
			tmp = arr[i];
			arr[i] = arr[j];
			arr[j] = tmp;
		}
	}
	//递归部分
	quick_sort(arr, l, j);
	quick_sort(arr, j+1, r);
}


int main()
{
	int arr[10] = { 9,8,5,1,2,3,2,1,4,6 };
	quick_sort(arr, 0, 9);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

值得注意的是,下一次递归时的边界问题,因为每一次分数组都会分成两个部分,所以每一次都会有两边递归排序,可以画图看出,最后一次右指针的位置是位于第一部分的最末尾元素,而左指针是位于第二部起始元素。
在这里插入图片描述
那么按照这个思想,边界的确定也可以用i来表示,也就可以写成:

	quick_sort(arr, l, i-1);
	quick_sort(arr, i, r);

注意:
X的确定问题,如果递归传递的数组边界选择 j 表示,那么X不能取 r ,同理,如果递归传递的数组边界选择用 i 表示,那么X不能取 l 。
举个例子:
在这里插入图片描述
此时第一个递归无效,第二个递归传递的参数和原本传递过来的一样,就无限循环了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5-快速排序 的相关文章

  • 第二章:25+ Python 数据操作教程(第一节Python 中的数据结构)

    这篇文章解释了 Python 中使用的数据结构 了解编程语言中的数据结构至关重要 在 Python 中 有许多可用的数据结构 它们如下 1 字符串 2 列出 3 元组 4 词典 5 套 目录 1 字符串 2 列表 3 元组 4 字典 5 套
  • Java-Redis缓存穿透,击穿,雪崩和布隆算法

    Java Redis缓存穿透 击穿 雪崩和布隆算法 1 缓存穿透概念 2 如何解决缓存穿透 3 什么是缓存击穿 4 什么是缓存雪崩 5 导致缓存雪崩的原因 6 缓存穿透 缓存击穿 缓存雪崩的区别 1 缓存穿透概念 当一个用户想要查询数据时
  • LRU算法java实现

    1 lru简介 LRU是Least Recently Used的缩写 即最近最少使用 常用于页面置换算法 是为虚拟页式存储管理服务的 即当一个数据最近一段时间没有被访问 未来被访问的概率也很小 当空间被占满后 最先淘汰最近最少使用的数据 2
  • Android动态来改变App桌面图标

    时不时的我们就会发现 一些我们常见的应用 比如某宝 某东 在一些特殊的日子中 比如双十一 元旦 为了迎合这样一个日子的气氛 在桌面的应用图标就会发生改变 其实对于这样的一个桌面图标更换 Android中为我们提供了AndroidManife

随机推荐

  • spring data jpa 关联查询返回自定义对象

    Override public List
  • Linux性能检测常用的10个基本命令

    1 uptime 该命令可以大致的看出计算机的整体负载情况 load average后的数字分别表示计算机在1min 5min 15min内的平均负载 2 dmesg tail 打印内核环形缓存区中的内容 可以用来查看一些错误 上面的例子中
  • vue3组件库搭建并且发布到npm保姆教程连载一

    前言 小时候的梦想是拥有一个自己的组件库 开玩笑哈 接触前端后 很多时候在npm install的时候 我在想我们安装的这些依赖发布者是如何将依赖发布到npm 并且可以让别人使用的 未知是让人害怕的 经过一系列学习和探索后 我也拥有了自己的
  • 【python数据挖掘课程】二十六.基于SnowNLP的豆瓣评论情感分析

    这是 Python数据挖掘课程 系列文章 前面很多文章都讲解了分类 聚类算法 而这篇文章主要讲解如何调用SnowNLP库实现情感分析 处理的对象是豆瓣 肖申克救赎 的评论文本 文章比较基础 希望对你有所帮助 提供些思路 也是自己教学的内容
  • 全国青少年电子信息智能创新大赛(决赛)python·模拟三卷,含答案解析

    全国青少年电子信息智能创新大赛 决赛 python 模拟三卷 一 程序题 第一题 描述 现有 n 个人依次围成一圈玩游戏 从第 1 个人开始报数 数到第 m 个人出局 然 后从出局的下一个人开始报数 数到第 m 个人又出局 如此反复到只剩下
  • Google分布式三篇论文---BigTable

    Google s BigTable 原理 翻译 题记 google 的成功除了一个个出色的创意外 还因为有 Jeff Dean 这样的软件架构天才 官方的 Google Reader blog 中有对BigTable 的解释 这是Googl
  • TensorRT(2):TensorRT的使用流程

    TensorRT系列传送门 不定期更新 深度框架 TensorRT 文章目录 一 在线加载caffe模型 序列化保存到本地 二 反序列化直接加载保存后的trt模型 以caffe分类模型为例 简单介绍TRT的使用流程 这里不涉及量化 就以fp
  • 测试的艺术:代码检查、走查与评审

    软件开发人员通常不会考虑的一种测试形式 人工测试 大多数人都以为 因为程序是为了供机器执行而编写的 那么也该由机器来对程序进行测试 这种想法是有问题的 人工测试方法在暴露错误方面是很有成效的 实际上 大多数的软件项目都应使用到一下的人工测试
  • 详解Shell 脚本中 “$” 符号的多种用法

    通常情况下 在工作中用的最多的有如下几项 1 表示执行脚本传入参数的个数 2 表示执行脚本传入参数的列表 不包括 0 3 表示进程的id Shell本身的PID ProcessID 即脚本运行的当前 进程ID号 4 Shell最后运行的后台
  • 解决uni-toast被弹窗组件遮挡

    在App vue uni toast设置层级比popup高就行 uni toast z index 999999
  • 输入文本就可建模渲染了?!OpenAI祭出120亿参数魔法模型!

    转自 https new qq com omn 20210111 20210111A0CBRD00 html 2021刚刚开启 OpenAI又来放大招了 能写小说 哲学语录的GPT 3已经不足为奇 那就来一个多模态 图像版GPT 3 今天
  • 微信小程序事件和页面跳转

    一 页面跳转 1 非TabBar页面 一个小程序拥有多个页面 我们通过wx navigateTo进入一个新的页面 我们通过下边点击事件实现页面跳转进行代码实现及参考 wx navigateBack 回退到上一个页面 wx redirectT
  • 【单片机毕业设计】【mcuclub-310】红外遥控器

    设计简介 项目名 基于单片机的红外遥控器的设计 标准版 单片机 STC89C52 功能简介 1 利用红外发射电路 通过按不同的按键发送不同的数据值 2 利用红外接收电路 接收发送端发送的数据 3 通过数码管显示数据 资料预览 效果图 发送端
  • MiniGPT-4本地部署的实战方案

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • Ubuntu22下OpenCV4.6.0+contrib模块编译安装

    目录 第一章 Ubuntu22下OpenCV4 6 0 contrib模块编译安装 第二章 ubuntu22下C kdevelop环境搭建 OpenCV示例 第三章 C 下OPENCV驱动调用海康GigE工业相机 文章目录 目录 Ubunt
  • K8S常用资源认识

    文章目录 一 Namespace 二 Pod 三 Label 四 Deployment 五 Service 一 Namespace namespace是kubernetes系统中的一种非常重要的资源 它的主要作用是用来实现多套环境的资源隔离
  • 基于栈与基于寄存器的指令集架构

    用C的语法来写这么一个语句 C代码 a b c 如果把它变成这种形式 add a b c 那看起来就更像机器指令了 对吧 这种就是所谓 三地址指令 3 address instruction 一般形式为 op dest src1 src2
  • python 模块和包

    文章目录 前言 模块 什么是模块 导入模块 import 导入模块 from 模块名 import 功能 from 模块名 import as定义别名 制作模块 模块的定位顺序 all 包 导入包 import 包名 模块 导入包 from
  • 打开Ubuntu18.04出现启动紫屏卡死不弹登录框问题

    1 进入grub高级模式 重启虚拟机 按esc进入 按 进入Ubuntu高级选项 2 选择recovery mode 3 选择root shell会话 输入root密码 4 编辑 etc gdm3 custom conf文件 将 Wayla
  • 5-快速排序

    假设有下面这样一排数据需要排序 3 7 6 1 2 9 1 2 6 排开常用的冒泡和选择排序 今天我们来试一下一种新的方法 快速排序 快速排序的思路如下 首先我们要先从这组数据中选出一个任意值X 然后以X为分界 比X小的数据排到X的左半边