快速排序优化

前面的三篇文章中,为大家介绍了快速排序的三种划分方法。那么,这里我们想一想,快速排序是否也会有效率低的情况呢?答案是肯定的,快速排序对于数据是敏感的,如果这个数列是非常无序,杂乱无章的,那么快速排序的效率是非常高的,可是如果数列有序,往往快速排序的时间复杂度便由O(nlog2n)退化到O(n ^2),即相当于冒泡排序。所以,我们需要优化快速排序,这里用到的便是三数取中

三数取中

即知道这组无序数列的首和尾后,我们便可以求出这个无需数列的中间位置的数,我们只需要在首,中,尾这三个数据中,选择一个排在中间的数据作为基准值,进行快速排序,即可进一步提高快速排序的效率。那么为什么要取中间呢?我们可以假设待排序的数列是一组高度有序的数列,显然首极大可能是最小值,尾极大可能是最大值,此时如果我们选取一个排在中间的值,哪怕是在最坏的情况下,begin和end只需要走到中间位置,那么这个中间值的位置也就确定下来,而不需要begin或end指针要把整个数列遍历一边,从而大大提高快速排序的效率。这种优化方法很简单,只需要在选取基准值之前,执行一边三数取中的函数即可,想必这个函数大家都会写吧。

int choicmidenum(int* array,int begin,int end)
{int mid = begin + (end - begin)/2;//获取中间值的下标//当begin<mid时,if(array[begin] < array[mid]){//如果mid<endif(array[mid] < array[end])return mid;else{if(array[begin] > array[end])//若begin>endreturn begin;elsereturn end;}}//mid>beginelse{//mid>endif(array[mid] > array[end])return mid;else{if(array[begin] < array[end])//begin<endreturn begin;elsereturn end;}}
}

我们取霍尔划分看一下优化后的代码

int houlepartion(int* array,int begin,int end)
{//三数取中int mid = getmid(array,begin,end);swap(array,begin,mid);//交换mid和begin的值//选择基准值int key = array[begin];//设置基准值int start = begin;//记录基准值的位置while(begin<end){//从后往前找第一个小于key的位置while(begin<end&&array[end] >= key)--end;//从前往后找第一个大于key的位置while(begin<end&&array[begin] <= key)++begin;swap(array,begin,end);}swap(array,start,begin);return begin;
}

这种方法对快速排序的效率有很高的提升哦,大家可以记下这种优化方法哦

快速排序优化——三数取中法相关推荐

  1. c++ 快排优化(三数取中法)

    快排优化(三数取中法) 文章目录 快排优化(三数取中法) 前言 一.三数取中法 二.递归思想 三.程序实现过程(代码) 1.取基准数(三数取中) 2.快速排序(递归) 总结 前言 作为刚刚入门c和c+ ...

  2. (排序5)快速排序(Hoare,选key的随机数与三数取中优化,挖坑法与前后指针法等)

    快速排序 (Hoare大佬版本) 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左 ...

  3. 乘积取中法matlab,迭代取中法、乘同余法及混合同余法产生随机数方法

    在用计算机编制程序时,经常需要用到随机数,尤其在仿真等领域,更对随机数的产生提出了较高的要求,仅仅使用 C 语言类库中的随机函数已难以胜任相应的工作.现实中,用投色子计数的方法产生真正的随机数,但电脑 ...

  4. 乘积取中法matlab,Matlab常用算法集合

    [实例简介] 包括了全书所有实例对应的MATLAB的M文件.所有代码按照章节存放在各个文件夹下,如"第4章插值"文件夹下存放了本书第4章所有的算法程序代码,对于算法的程序代码,在光 ...

  5. 使用散列表进行查找【查找关键词:电话号码,名称】【平方取中法,除留余数法】【开放地址探测法,公共溢出区法】【计算ASL】

    Library import pandas as pd import numpy as np import time 读取数据 df = pd.read_excel('重庆市印刷和记录媒介复制业754 ...

  6. 平方取中法随机数函数

    一个做游戏软件的人,要做一个随机数函数用,抛出这样一个概念来.一群热爱做游戏的人,在那里讨论,- 平方取中法(midsquare method)是产生[0,1]均匀分布随机数的方法之一,亦称冯·诺伊曼 ...

  7. 数据结构—— 构造散列函数的六种方法【直接定址法-数字分析法-平方取中法-折叠法-除留余数法-随机数法】

    目录: 一:直接定址法 二:数字分析法 三:平方取中法 四:折叠法 五:除留余数法 六:随机数法 这些方法原理都是将原来数字按某种规律变成另一个数字 一:直接定址法 取关键字的某个线性函数值作为散列地 ...

  8. 乘积取中法matlab,遺傳算法(GA)的matlab實現

    一.TASK compute the maximum value: 二.實現過程 1.     編碼與解碼 編碼: 在編碼之前需要確定求解的精度,設定求解的精度為小數點后六位,即10^6.這樣可以將每 ...

  9. 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)

    排序上 排序上 交换类排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. ...

最新文章

  1. java实现fread_fread函数读取到的数据和实际数据不一样
  2. C# 中 以 # 打头的 编码 是: html 编码解码地址 转换
  3. Java线程详解(14)-信号量
  4. amazon mws api 获取所有产品_致跨境电商新卖家 - 如何确定一个产品的市场容量?...
  5. boost::multi_array模块实现index_range 的测试
  6. 使用ssh免密码登录Linux服务器
  7. linux3.10内核支持mpls,将MPLS编译进linux内核中
  8. 【pytorch】torch.cuda.empty_cache()==>释放缓存分配器当前持有的且未占用的缓存显存
  9. 朋友圈、浏览器分享实现
  10. go 语言的web 框架
  11. 从程序员小仙飞升上神,java技术开发要如何实现?
  12. Oracle 连接查询一
  13. python 绘制多个子图
  14. VS2013的C# Winform怎么添加Windows Media Player控件 详细图解 代码示例及运行效果
  15. 微信开发者工具登录问题,网络连接失败
  16. 用打比方的方法,10分钟给小白讲清楚Kubernetes
  17. java--------------
  18. Cadence基础知识4(焊盘制作比较重要的3点以及热风焊盘的作用和制作 )
  19. 大众点评评论抓取-加密评论信息完整抓取
  20. 贝叶斯分类器做文本分类案例

热门文章

  1. DARPA举办AlphaDogfight决赛,AI 操控战斗机5:0战胜人类飞行员
  2. ue4 后期处理景深_【UE4设计师】2-3后期处理效果——使用景深设置电影拍摄
  3. 原生 hadoop安装
  4. 【CAD案例】通过.scr脚本实现图纸集视口对齐
  5. 计算机视觉博士去向,为什么现在不看好 CV 方向了呢?
  6. 【PAT甲级】1142 Maximal Clique
  7. Jmeter介绍与使用
  8. Messaging短信源码导入AndroidStudio
  9. PyMySQL安装问题解决办法-UnicodeDecodeError:gbk codec cannot decode byte 0xaf
  10. Python基础 - 文件拷贝