数据结构:算法篇:快速排序;直接插入排序
目录
快速排序
直接插入排序
改良版冒泡排序
快速排序
理解:
①从待排序元素中选定一个基准元素;
②以基准元素将数据分为两部分:(可以将:大于基准元素放左,小于基准元素放右)
③对左半部分(从左端到基准数据)进行①②操作;直到数据有序
即将左端到基准数据作为范围,传入;这个范围又会产生新的范围:左端到基准数据2;
……
直到数据有序
④对左半部分(从基准数据到右端)进行①②操作;
【粗劣分析:便于理解】
右半部分:
【深层分析:便于代码】
遍历直倒有序:
数据有序后返回上一层
代码思路
/*
思路:
选定一个基准(默认左端): 用变量temp记录基准值;
loop:
此时左端所在下标low代表的值可以被覆盖(值已经被复制了)
从右端向左端的方向,开始与temp比较,直到遇到比temp小的数,(否则就high--左移),将这个小于temp的数(下标可假定为high')放到左边,左边下标low所在的数据上
此时右端所在下标high代表的值可以被覆盖(值已经复制到下标low代表的值内了)
从左端向左端的方向,开始与temp比较,直到遇到比temp大的数,(否则就low++后移),将这个大于temp的数(下标可假定为low')放到右边,左边下标high所在的数据上
此时左端low'下标的数据可以被覆盖,回到loop;
循环结束条件:low'后移high'前移 直到相遇,说明以基准值temp将这批数据分成两份完毕。
注意:此时大小两份虽然分类完成,但是 作为基准值的数据 还未找到位置;【基准值应该放在下标为low的位置】
看下面图理解
注意,此时应low==high并且理应必须low==high,
注意,此时下标所在位置的数据应该被覆盖,
故基准值应该放在下标为low的位置(或者下标为high,反正两值相等)
*********************************************************
《基准值临界情形图》
基准值5
x x x x 6 3 x x x
l h 此时基准值正在与l所代表元素比较l向右移中(说明h位置是无用数据)
x x x x 6 6 x x x
l h l数据复制给h,轮到下标h向左移动
x x x x 6 6 x x x
↑ 两下标重合相等,此时应该放入基准值temp(h现在是无用数据)(low左边比基准值小,high右边比基准值大)
基准值7
x x x x 6 5 x x
l h 此时基准值正在与l所代表元素比较h向左移动中(说明l位置是无用数据)
x x x x 5 5 x x
l h h数据复制给l,轮到下标l向左移动(h现在是无用数据)
x x x x 5 5 x x
↑ 两下标重合相等,此时应该放入基准值temp(h现在是无用数据)(low左边比基准值小,high右边比基准值大)
*********************************************************
*/
全部代码:
#include <stdio.h>//显示函数
void showData(int buf[],int len)
{//显示for(int i=0;i<len;i++)printf("%d ",buf[i]);printf("\n");
}//快速排序函数/*************************************************************************
函数功能: 对传入的数据进行一次快速排序(分成大于基准值和小于基准值的两部分);
输入参数: 待排序的数组,需要排序的下标范围(左端下标、右端下标);
返回值: 基准所在的下标
*************************************************************************/
/*
思路:
选定一个基准(默认左端): 用变量temp记录基准值;loop:
此时左端所在下标low代表的值可以被覆盖(值已经被复制了)
从右端向左端的方向,开始与temp比较,直到遇到比temp小的数,(否则就high--左移),将这个小于temp的数(下标可假定为high')放到左边,左边下标low所在的数据上此时右端所在下标high代表的值可以被覆盖(值已经复制到下标low代表的值内了)
从左端向左端的方向,开始与temp比较,直到遇到比temp大的数,(否则就low++后移),将这个大于temp的数(下标可假定为low')放到右边,左边下标high所在的数据上此时左端low'下标的数据可以被覆盖,回到loop;循环结束条件:low'后移high'前移 直到相遇,说明以基准值temp将这批数据分成两份完毕。注意:此时大小两份虽然分类完成,但是 作为基准值的数据 还未找到位置;【基准值应该放在下标为low的位置】看下面图理解
注意,此时应low==high并且理应必须low==high,
注意,此时下标所在位置的数据应该被覆盖,
故基准值应该放在下标为low的位置(或者下标为high,反正两值相等)
*********************************************************
《基准值临界情形图》
基准值5
x x x x 6 3 x x xl h 此时基准值正在与l所代表元素比较l向右移中(说明h位置是无用数据)
x x x x 6 6 x x xl h l数据复制给h,轮到下标h向左移动
x x x x 6 6 x x x↑ 两下标重合相等,此时应该放入基准值temp(h现在是无用数据)(low左边比基准值小,high右边比基准值大)
基准值7
x x x x 6 5 x x l h 此时基准值正在与l所代表元素比较h向左移动中(说明l位置是无用数据)
x x x x 5 5 x xl h h数据复制给l,轮到下标l向左移动(h现在是无用数据)
x x x x 5 5 x x↑ 两下标重合相等,此时应该放入基准值temp(h现在是无用数据)(low左边比基准值小,high右边比基准值大)
*********************************************************
*/int part(int arr[],int low,int high)
{//检查输入范围是否合法if(low>high){return -1;}//选定一个基准值(以左端作为基准值)int temp=arr[low];//注意:下标low所在数据被temp保存//结束循环的条件while(low<high){//比较右端,比基准大的仍然放在右边,不用管,继续向前判断下一个:故high--;while(temp<arr[high]&&low<high){high--;//下标向前移动,判断下一个}//条件不满足时出循环,将这个小数据放到左边,下标为low的地方(low数据已经被保存)arr[low]=arr[high];//开始比较左端:比基准小得仍然放左边,继续向后判断下一个while(temp>arr[low]&&low<high){low++;}//条件不满足,跳出循环,将这个小数据放到左边arr[high]=arr[low];//此时high所在数据,之前已经被放到循环前的low里了/*注意:这里内层循环增设了条件为low<high,图形解释: 见最下方《基准值临界情形图》PRO文字解释:当low与high相差为1时,假定low与low将值给high,开始判断high,此时high的值必定会满足,所以high会左移high移动到low的位置,仍然会满足值的条件条件high继续移动到low的左边,此时high值不满足条件;出循环并且交换数据;回到大循环,判断low<high*/}//运行到此,说明low==high;arr[high]=temp;return high;//基准所在下标low或者high都可以
}void quick_sort(int arr[],int low,int high)
{if(low>=high){return;}int mid=part(arr,low,high);quick_sort(arr,low,mid-1);quick_sort(arr,mid+1,high);
}int main()
{int arr[]={82,15,49,85,28,43,39,17,47,48};int len=sizeof(arr)/sizeof(arr[0]);printf("len=%d\n",len);//快速排序quick_sort(arr,0,9);//数据显示showData(arr,len);
}/*
*********************************************************
《基准值临界情形图》PRO 临界情形分析
基准值5
x x x x 6 3 x x xl h 此时基准值正在与l所代表元素比较l向右移中(说明h位置是无用数据)
x x x x 6 6 x x xl h l数据复制给h,轮到下标h向左移动
x x x x 6 6 x x x↑ 两下标重合相等,此时应该放入基准值temp(h现在是无用数据)
x x x x 6 6 x x xh l 内层循环不加low<high;则h会一直移动!直到小于基准值,才回到外层循环判断low<high
基准值7
x x x x 6 5 x x l h 此时基准值正在与l所代表元素比较h向左移动中(说明l位置是无用数据)
x x x x 5 5 x xl h h数据复制给l,轮到下标l向左移动(h现在是无用数据)
x x x x 5 5 x x↑ 两下标重合相等,此时应该放入基准值temp(h现在是无用数据)
x x x x 5 5 x xh l 内层循环不加low<high;则l会一直移动!直到大于基准值,才回到外层循环判断low<high
*********************************************************
*/
直接插入排序
//直接插入排序
void insert_sort(int arr[],int len)
{for(int i=1;i<len;i++)//{int temp=arr[i];//选定第i个,进行插入int j;for(j=i-1;j>=0&&arr[j]>temp;j--)//将在"我"之前的数据,依次向后搬运,直到遇到第一个比自己小的元素{arr[j+1]=arr[j];}arr[j+1]=temp;//插入位置!注意执行了"j--"才出的循环}
}
改良版冒泡排序
//改良版冒泡排序
void bubble_sort(int buf[],int len)
{int temp;int flag=1;for(int i=0;i<len&&flag;i++)//轮数{flag=0;//使用标志位前,标志位初始值for(int j=0;j<len-1-i;j++)//每轮比较次数{if(buf[j]>buf[j+1]){flag=1;//发生交换,标志位置1temp=buf[j+1];buf[j+1]=buf[j];buf[j]=temp;}}//一轮下来没有发生交换,排序已完成,跳出循环}
}
相关文章:
数据结构:算法篇:快速排序;直接插入排序
目录 快速排序 直接插入排序 改良版冒泡排序 快速排序 理解: ①从待排序元素中选定一个基准元素; ②以基准元素将数据分为两部分:(可以将:大于基准元素放左,小于基准元素放右) ③对左半部分…...
WebAPI编程(第一天,第二天)
WebAPI编程(第一天,第二天) day01 - Web APIs 1.1. Web API介绍 1.1.1 API的概念1.1.2 Web API的概念1.1.3 API 和 Web API 总结 1.2. DOM 介绍 1.2.1 什么是DOM1.2.2. DOM树 1.3. 获取元素 1.3.1. 根据ID获取1.3.2. 根据标签名获取元素1.3.…...
查看MySQL存储引擎方法,表操作
修改数据库表存储引擎 show create table dept; show table status from itpux where name s2\G; select * from information_schema.TABLES where table_schemaitpux and table_names3; 查询整个mysql里面存储引擎是innodb/myisam的表 建表时候要写好存储引擎 -- 创建表 -- 表…...
【Python教程】Python3基础篇之Number(数字)
博主介绍:✌全网粉丝21W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...
基于openEuler22.09部署OpenStack Yoga云平台(一)
OpenStack Yoga部署 安装OpenStack 一、基础准备 基于OpenStack经典的三节点环境进行部署,三个节点分别是控制节点(controller)、计算节点(compute)、存储节点(storage),其中存储…...
I.MX6U 启动方式详解
一、启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置 来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次,后面就…...
施耐德变频器ATV320系列技术优势:创新与安全并重
在工业自动化领域,追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证,成为能够帮助企业降低安装成本,提高设备性能的创新解决方案。 【全球认证,品质保障】ATV320 系列秉持施耐德…...
系统思考—全局思维
昨天接到一个企业需求,某互联网公司VP希望N-1的核心团队一起学习系统思考,特别是在新业务快速发展的阶段。公司增长势头不错,但如何解决跨部门的协作问题,成为了瓶颈。全局思维就是关键。产品、技术、市场、运营、客服……如何打破…...
Windows如何切换用户访问局域网共享文件夹,如何切换网上邻居的账户
Windows如何切换用户访问局域网共享文件夹,如何切换网上邻居的账户 查看共享连接 使用net use命令可以查看当前已经建立的共享连接。net use删除共享连接 使用net use * /del 或net use * /delete命令可以删除所有当前的共享连接。net use * /delnet use * /delete如果只想删除…...
如何在谷歌浏览器中启用语音搜索
想象一下,你正在拥挤的地铁上,双手都拿着沉重的购物袋,突然你想搜索附近的咖啡馆。此时如果你能通过语音而不是打字来进行搜索,那将多么的便利!在谷歌浏览器中,启用语音搜索功能就是这么简单而高效…...
HarmonyOS NEXT 技术实践-基于基础视觉服务实现骨骼点识别
本示例展示了如何在HarmonyOS Next中实现基于基础视觉服务的骨骼点识别功能。骨骼点识别是计算机视觉中的一项重要技术,广泛应用于运动分析、健身监控和增强现实等领域。通过使用HarmonyOS Next提供的视觉API,开发者能够轻松地对人物图像进行骨骼点检测&…...
Debian系统宝塔面板安装LiteSpeed Memcached(LSMCD)
参考链接 1. 官网指引: https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:lsmcd:installation 2. 安装OpenLiteSpeed官方LSMCD对象缓存替换Memcached详细图文教程 - 搬主题 实操记录: 首先LSMCD 默认的端口是11211,…...
tcp 的三次握手与四次挥手
问1: 请你说一下tcp的三次握手一次握手两次握手三次握手问: 为什么不四(更多)次握手? 问 2: 请说一下 tcp 的 4 次挥手一次挥手两次挥手问题:能不能等到数据传输完成再返回 ack? 三次挥手四次挥手问: 为什么要等两个最大报文存在时间? bg: tcp 是可靠的连接,如何保证 建立连…...
QT--信号与槽机制
什么是信号与槽? 在 Qt 中,信号与槽是一种用于对象间通信的机制。它使得一个对象可以通知其他对象某个事件的发生,而不需要直接知道这些对象的具体实现。这种机制非常适合事件驱动的编程模型,如用户界面交互。 1. 信号ÿ…...
vue3项目history路由模式部署上线405、刷新404问题(包括部分页面刷新404问题)
一、找不到js模块 解决方法:配置Nginx配置文件: // root /your/program/path/dist root /www/wwwroot/my_manage_backend_v1/dist;二、刷新页面导致404问题(Not found) 经过一系列配置后发现进入页面一切正常,包括路由前进和回退࿰…...
电阻容差是啥意思
定义 电阻器在生产过程中,由于工艺等因素的限制,其实际阻值不可能与标称阻值完全一致,总会存在一定的误差。例如,一个标称阻值为100Ω、容差为5%的电阻,其实际阻值可能在95Ω至105Ω之间。 产生原因 材料特性差异&a…...
Rust: offset祼指针操作
offset是偏移元素个数,不是字节数! fn main(){let student_a Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};let student_b Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};let …...
SD本地部署和云端部署的区别以及优劣
相信有相当多多小伙伴应该是看了一些技术或者设计的博主的教程后开始尝试使用SD的,在大多数的SD教程中,绝大多数都是推荐本地化的部署流程,毕竟本地部署后的SD自由度会显得高一些,大部分的操作也都完全可以实现,只不过…...
4、数据结构与算法解析(C语言版)--栈
栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。 1、创建项目 main.h #ifndef _MAIN_H #define _MAIN_H#include <stdio.h> #include <stdlib.…...
c# 后台任务自动执行
如果有些任务需要在后台自动执行,且时不时需要添加一个任务,且按照优先级顺序执行,那么可以参考本文的方法。 后台任务类 定义一个后台任务类BackgroundTaskThread,其中Start方法是用来启动任务的,循环查询是否有添加…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...



