当前位置: 首页 > news >正文

企业网站的设计风格动态素材网站

企业网站的设计风格,动态素材网站,百度推广开户代理,万网主机怎么上传网站吗在前面的部分已经讲过冒泡、选择、插入排序三种排序算法,本章节讲述快速排序,快速排序属于递归算法,同时很多语言的内置排序算法使用的就是快速排序。定义快速排序算法结合了分区和递归,步骤如下:对数组执行分区&#…

在前面的部分已经讲过冒泡、选择、插入排序三种排序算法,本章节讲述快速排序,快速排序属于递归算法,同时很多语言的内置排序算法使用的就是快速排序。

定义

快速排序算法结合了分区和递归,步骤如下:

  1. 对数组执行分区,分区后,基准值处于数组中的正确位置;
  2. 对分区后的每个子数组继续执行1、2两个步骤,即不断分区;
  3. 当某个子数组没有或者只有一个元素,则这就是递归的基础情形,不做任何操作。

分区

快速排序依赖一个概念-分区。还是以数组为例,选取数组中的某个值作为基准,以该基准为分界线,将小于基准的数值移动到基准左侧位置,将大于基准的数值移动到基准右侧位置,步骤如下:

  1. 选择数组最右侧数值为基准;
  2. 创建两个指针,一个指向数组第一个(最左侧)数值,此处暂且称为左侧指针,另一个指针指向数组最右侧数值(此处排除基准值所在的位置),此处暂且称为右侧指针;
  3. 左侧指针不断右移,直到遇到大于或等于基准的数值才停止;
  4. 右侧指针不断左移,直到遇到小于等于基准的数值或者数组的第一个元素才停止;
  5. 右侧指针停止后出现两种情况,如果左侧指针和右侧指针相遇或者交错,即左侧指针指向元素的数组索引等于或大于右侧指针指向的元素的数组索引,则继续执行步骤6;否则交换左侧指针和右侧指针指向的数值,然后跳转到步骤3继续执行;
  6. 交换基准和左侧指针指向的数值;

完成上述步骤后,可以保证基准值已经处于数组中的正确位置,但基准值左侧是数值和右侧的数值可能并不是按顺序排列的。代码如下:

	int partition(std::vector<int>& arr, int left, int right) {int pivotIndex{right};int pivot{arr[pivotIndex]};while (true) {while (arr[left] < pivot) {++left;}while (arr[right] > pivot) {++right;}if (left > right) {break;}else {std::swap(arr[left], arr[right]);++left;}}std::swap(arr[left], arr[right]);return left;}

递归

接下来就是对分区后的子数组进行递归,最后的快速排序实现如下:

	void quickSort(std::vector<int>& arr, int left, int right) {if (left >= right) return;int pivotIndex = partition(arr, left, right);quickSort(arr, left, pivotIndex - 1);quickSort(arr, pivotIndex + 1, right);}

时间复杂度

快速排序包含两类主要操作:比较和交换。以一次分区为例,数组中所有数值都需要和基准进行比较,为N;但不是每次比较都需要交换数值,最多需要N/2次交换。这是一次交换的时间步骤数,再乘以分区次数,即为快速排序的时间复杂度,但进行多少次分区是无法确定的,因为数组的原始排序不可知,假设数组是平均情况(有顺序有逆序,差不多各一半),则统计下来快速排序的时间负责大概为O(Nlog(N))。对比之前的插入排序,平均情况下快速排序还是比插入排序的O(N^{2})快很多。

快速选择

日常会遇到类似的算法题,即从数组中选出第十小或者第五大的数。一种解决方案是排序整个数组,再读取对应索引的数值,这种方法在平均情况下最快为O(Nlog(N))。另一种解决方案是部分使用快速排序的方法,可以称之为快速选择。快速选择即是将要找的数值索引与基准值索引做比较,这样每次都只需要对基准一侧的子数组进行递归,另一侧数组不用做额外处理,这种情况下快速选择的时间复杂度接近线性时间复杂度,即O(N),代码如下:ku

	int quickSelect(int queryValueIndex, std::vector<int>& arr, int left, int right) {if (left >= right) return;int pivotIndex = partition(arr, left, right);if(queryValueIndex < pivotIndex ){quickSelect(arr, left, pivotIndex - 1);}else if(queryValueIndex > pivotIndex){quickSelect(arr, pivotIndex + 1, right);}else{return arr[pivotIndex ];}}

快速排序和快速选择都是递归算法,虽然实现过程没有那么直观,但效率确实排序算法中最好的。至此,关于递归的部分就基本结束。一部分数据结构中使用了递归操作,如二叉查找树的前、中、后需查找等,这部分将在后续的文章中继续介绍。

http://www.dtcms.com/a/488783.html

相关文章:

  • 福州网站建设企业哪家好?网页制作模板 html
  • 做网站要费用多少广东品牌网站建设公司
  • 广东住房和城乡建设局网站首页wordpress扩展插件
  • 上海免费网站建设模板网站如何添加百度统计
  • 传奇网站模板怎么做的吗合肥房地产最新消息
  • 高端网站开发wordpress适配熊掌号
  • 用asp做网站遇到的问题如何把网站主关键词做到百度首页
  • 有域名就可以做网站吗苏州网络公司哪家最好
  • 小软件下载网站繁体网站怎么做
  • 专业企业网站开发联系电话网站seo计划
  • 网站开发新手什么软件好沈阳做网站有名公司有哪些
  • 国外免费logo网站网页升级防问广大
  • 毕设做网站答辩稿网站弹广告是什么样做的
  • 网站更换空间改版收录电子商务公司企业简介
  • 注册公司制作网站灌南县规划局网站理想家园规划建设
  • 太原网站优化多少钱深圳设计公司画册设计
  • 建设五证在那个网站可以查宁波网站建设rswl
  • asp做学生信息网站公司 宜宾网站建设
  • 网站建设 工作建议上海网站排名seo公司
  • 软件开发公司需要什么硬件设备大型seo公司
  • 域名查询ip福州seo关键词排名
  • 多周期框架中不同时间粒度的检验指标可比性
  • 收录网站源码开网店需要什么条件
  • 济南设计网站有没有专门做老年婚介的网站
  • 代做单片机毕业设计网站自建网站营销是什么
  • 吉林城市建设学校网站北京创意网站设计
  • 有口碑的宜昌网站建设什么网站都有漏洞
  • 漂亮购物网站欣赏自建 wordpress
  • 企业制作网站服务网站建设邀请招标书
  • 网站站点名中文网站数量