排序(2)

我们在排序(1)中说到选择排序的代码:

void SelectSort(int* a,int n)
{int begin=0,end=n-1;int mini=begin,max=begin;for(int i=begin+1;i<=end;i++){if(a[i]>a[max]){maxi=i;}if(a[i]<a[mini]){mini=i;}++begin;--end;}Swap(&a[beign],&a[mini]);Swap(&a[end],&a[maxi]);
}

那么当我们解决下面这个问题的时候:当开始时,begin=0,end=7,mini=begin=0,maxi=begin=0。i=1,1小于0,所以mini=1。a[mini]=1,++begin,begin=1,--end,end=6。此时最大值是9(begin),最小值是1(i)。

i=2,begin=1,end=6。

当begin和max重合,就会出现

4 3 5 6 

正确的代码应该是这样的:

void SelectSort(int* a,int n)
{int begin=0,end=n-1;int mini=begin,maxi=begin;for(int i=begin+1;i<=end;i++){if(a[i]>a[max]){maxi=i;}if(a[i]<a[mini]){mini=i;}}Swap(&a[begin],&a[mini]);if(maxi==begin){maxi=mini;}Swap(&a[end],&a[maxi]);++begin;--end;
}

快速排序

把小的换到左边,把大的换到右边。

动图链接地址如下:

https://gitee.com/bithange/113-issues/raw/master/24%E5%B9%B4-05%E6%9C%8827%E6%97%A5--%E6%8E%92%E5%BA%8F/%E5%8A%A8%E5%9B%BE/hoare.gif 单趟快排代码如下:

void QuickSort(int* a,int left,int right)
{int key=a[left];int begin=left,end=right;while(begin<end){//右边找小while(begin<end&&a[end]>=key)//加等号,相等的值放左边或者右边都无所谓{--end;}//左边找大while(begin<end&&a[begin]>key){++begin;}Swap(&a[begin],&a[end]);}Swap(key,&a[begin]);
}

这段代码有一些问题,让我们逐个解决吧!

首先,记录值只是复制了一个值,比如
int a = 10;
int b = a;
修改b的值对a的值没有影响
记录索引,修改的就是索引对应的值

什么情况下不需要对数组进行分割了呢?一种是这个区间只有一个值,另一只种是这个区间不存在。(结束条件)
 

void QuickSort(int* a,int left,int right)
{int keyi=left;int begin=left,end=right;if(left>right)return;while(begin<end){//右边找小while(begin<end&&a[end]>=key)//加等号,相等的值放左边或者右边都无所谓{--end;}//左边找大while(begin<end&&a[begin]>key){++begin;}Swap(&a[begin],&a[end]);}Swap(&a[keyi],&a[begin]);keyi=begin;//[left,keyi-1] keyi [keyi+1,right]'QuickSort(a,left,keyi-1);QuickSort(a,keyi+1,right);
}

选key如果每一次都在最前面,那么就不合理,我们期望选择的key每次都是最中间的值。

1随机数选key

2三数取中(把选中的数挪到最左边)

int GetMid(int* a,int left,int right)
{int mid=(left+right)/2;if(a[left]<a[mid]){if(a[mid]<a[right]){return mid;}else if(a[left]<a[right]){return right;}elsereturn left;}else{if(a[mid]>a[right]){return mid;}else if(a[left]<a[right]){return left;}elsereturn right;}
}

但是当需要排序的数字只有几个时,需要进行的趟数就多了,而且很浪费。所以,在进行判断时,我们需要加上一个条件。那么在这样一个数字较少的情况下,我们应该选择哪种排序呢?希尔排序的优势就是让大的数更快跳到后面,小的数更快跳到前面。

int GetMid(int* a,int left,int right)
{if(right-left+1<10)//小区间优化,不再递归分割排序,减少递归次数{InsertSort(a+left,right-left+1);}else{int mid=(left+right)/2;if(a[left]<a[mid]){if(a[mid]<a[right]){return mid;}else if(a[left]<a[right]){return right;}elsereturn left;}else{if(a[mid]>a[right]){return mid;}else if(a[left]<a[right]){return left;}elsereturn right;}}
}

结论:左边做key,右边先走,可以保证相遇位置的值比key要小。
相遇的场景分析:
L遇R:R先走,停下来,R停下条件是遇到比key小的值,R停的位置一定比key小,L没有找大的,遇到R停下了
R遇L:R先走,找小,没有找到比key小的,直接跟L相遇了。L停留的位置是上一轮交换的位置,上一轮交换,把比key小的值,换到L的位置了

相反,让右边做key,左边先走,可以保证相遇位置的值比key要大。

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

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

相关文章

SKF轴承故障频率查询

1&#xff0c;第一步&#xff1a;搜索轴承型号 skf官网 2&#xff0c;第二步&#xff1a;查询故障频率。 第三步&#xff1a;

尚品汇-(十四)

&#xff08;1&#xff09;提交git 商品后台管理到此已经完成&#xff0c;我们可以把项目提交到公共的环境&#xff0c;原来使用svn&#xff0c;现在使用git 首先在本地创建ssh key&#xff1b; 命令&#xff1a;ssh-keygen -t rsa -C "your_emailyouremail.com" I…

完美解决ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)

已解决ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 下滑查看解决方法 文章目录 报错问题解决思路解决方法交流 报错问题 ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 解决思路 对…

InfluxDB v2.x中的Flux基本概念

InfluxDB v2.x中的Flux查询语言的核心概念主要包括以下几个方面&#xff1a; 1. 表&#xff08;Tables&#xff09; Flux以表&#xff08;Tables&#xff09;的形式处理数据。每个表包含多行数据&#xff0c;每行数据都是一个record&#xff08;记录&#xff09;&#xff0c;…

落日余晖映晚霞

落日余晖映晚霞&#xff0c;立于海滨&#xff0c;望夕阳余晖洒于波光粼粼之上&#xff0c;金光跳跃&#xff0c;若繁星闪烁&#xff0c;耀人心目。 海风轻拂&#xff0c;心境宁静&#xff0c;凡尘俗务皆于此刹那消散&#xff0c;思绪万干&#xff0c;或忆往昔点滴&#xff0c;或…

刷爆leetcode第十期

题目一 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 首先我们要来判断下它们的根是否相等 根相等的话是否它们的左子树相等 是否…

在CMD中创建虚拟环境并在VSCode中使用和管理

1. 使用Conda创建虚拟环境 在CMD或Anaconda Prompt中执行以下代码以创建一个新的虚拟环境&#xff1a; conda create -n my_env python 3.8 这样会创建一个名为 my_env 的环境&#xff0c;并在Anaconda环境目录下生成一个相应的文件夹&#xff0c;包含该虚拟环境所需的所有…

GD32实战篇-双向数控BUCK-BOOST-BOOST升压理论基础

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

MySQL之备份与恢复(八)

备份与恢复 还原逻辑备份 如果还原的是逻辑备份而不是物理备份&#xff0c;则与使用操作系统简单地复制文件到适当位置的方式不同&#xff0c;需要使用MySQL服务器本身来加载数据到表中。在加载导出文件之前&#xff0c;应该先花一点时间考虑文件有多大&#xff0c;需要多久加…

金蝶云苍穹-插件开发(二)新建、更新、删除数据

加载本页面数据 关于加载数据&#xff0c;还要多补充一个点&#xff0c;如果要加载一个基础资料/单据界面中正在操作的界面&#xff0c;比如要获取刚填写好的字段值&#xff0c;就要获取当前界面的模型层&#xff0c;再获取具体数据。具体操作如下&#xff1a; //获取日任务信…

C++ 函数高级——函数的占位参数

C中函数的形参列表里可以有占位参数&#xff0c;用来做占位&#xff0c;调用函数时必须填补改位置 语法&#xff1a; 返回值类型 函数名&#xff08;数据类型&#xff09;{ } 在现阶段函数的占位参数存在意义不大&#xff0c;但是后面的课程中会用到该技术 示例&#xff1a;…

STM32快速复习(八)SPI通信

文章目录 前言一、SPI是什么&#xff1f;SPI的硬件电路&#xff1f;SPI发送的时序&#xff1f;二、库函数二、库函数示例代码总结 前言 SPI和IIC通信算是我在大学和面试中用的最多&#xff0c;问的最多的通信协议 IIC问到了&#xff0c;一般SPI也一定会问到。 SPI相对于IIC多了…

heml之样式布局技巧博客

在编写关于 HEML&#xff08;HTML CSS JavaScript&#xff09;的样式布局技巧博客时&#xff0c;可以涵盖很多不同的方面 1. 响应式设计 介绍媒体查询&#xff08;Media Queries&#xff09;以及如何根据设备尺寸调整样式。使用百分比宽度、视口单位&#xff08;vw、vh&…

含并行连结的网络

一、Inception块 1、白色部分通过降低通道数来控制模型复杂度&#xff0c;蓝色做特征提取工作&#xff0c;每条路上的通道数可能不同&#xff0c;大概我们会把更重要的那部分特征分配更多的通道数 2、Inception只改变高宽&#xff0c;不改变通道数 3、在不同的情况下需要选择…

pin是什么?管脚

1.平面分割 1)启动Allegro PCB design &#xff0c;打开.brd。深色部分属于一个net&#xff0c;要做一下修改&#xff0c;将上面的pin包含进shape中&#xff0c;i进行a&#xff0c;b两步操作&#xff0c;删除以前存在的Anti Etch下的line&#xff0c;再将其进行补齐 使它保住上…

【帧中继实验-ensp】

实验要求 在R1上开启一个点对点子接口&#xff0c;用于连接 R1–R2&#xff0c;两端IP地址为12.1.1.x 。开启一个多点子接口 &#xff0c;用于连接R1–R3&#xff0c;R4&#xff0c;两段IP地址为134.1.1.x。 具体DLCI分配和映射关系如下&#xff1a; R1 102 R2 201—动态映射…

python获取海康威视所有摄像头的OSD通道名称

读取IP地址的txt文档 根据IP地址获取监控摄像头的OSD通道名称 # codingutf-8 import os import time import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth import xml.etree.ElementTree as ET #注意&#xff1a;和ip.txt放在一个文件夹&#xff0c;会生…

论文略读:Can Long-Context Language Models Subsume Retrieval, RAG, SQL, and More?

202406 arxiv 1 intro 传统上&#xff0c;复杂的AI任务需要多个专门系统协作完成。 这类系统通常需要独立的模块来进行信息检索、问答和数据库查询等任务大模型时代&#xff0c;尤其是上下文语言模型&#xff08;LCLM&#xff09;时代&#xff0c;上述问题可以“一体化”完成…

【程序大侠传】大表分库分表切换数据库类型导致pagehelper生成sql语法报错

前序 代码剑宗等级分明&#xff0c;其门下弟子等级划分如下&#xff1a; 入门弟子 刚刚拜入代码剑宗&#xff0c;学习基础编程语言和基本剑法&#xff08;语法和基础概念&#xff09;。他们的代码还显得生涩&#xff0c;但已经开始展现出对优雅代码的追求。 江湖小虾 初步掌握…

《python程序语言设计》2018版第5章第53题利用turtle绘制sin和cos函数 sin蓝色,cos红色和52题类似

直接上题和代码 5.53 &#xff08;Turtle&#xff1a;绘制sin和cos函数&#xff09;编写程序绘制蓝色的sin函数和红色的cos函数。 代码和结果 turtle.speed(10) turtle.penup() # sin 用蓝色 turtle.color("blue") #这道题和上道题一样&#xff0c;先把turtle放到起始…