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

从分治的思想下优化快速排序算法

快速排序是对于数组元素进行排序的一种方法,基本原理是:在数组中随任意选择一个元素作为参考(key),使得数组分为两部分,左部分小于等于key右部分大于key,这样经过一次排序后key的值就会在他最终正确的位置,接下来就是让左右两个子数组继续重复上述操作,知道把数组分成1或2个元素(递归)。但这种方法如果遇到数组中有重复元素会增加时间复杂度,如果数组都是同一个元素,那么每次进行排序后,key都会到最右端,这样时间复杂度就是n平方了。因此,我们需要优化一下,用三指针把数组分成三部分再进行递归。

关于随机key的选取我们也非常重要,在算法导论中写到随机地选取key值也有利于优化时间复杂度,一会我们在代码中演示。

剩下的就是每次把数组分割后进行排序,然后每个子数组再次被分割再次排序。排序方法参考分治算法排序

vector<int> sortarray(vetor<int>&nums)
{srand(time(NULL));qsort(nums,0,nums.size()-1);return nums;
}void qsort(vector<int>%nums,int l,int r)
{if(l<=r) return;int i=l,left=l-1,right=r+1;int key=getrandom(nums,l,r);while(i<right){if(nums[i]<key) swap(nums[++left],nums[i++];else if(nums[i]==key) i++;else swap(nums[--right],nums[i]);}//[left+1,right-1]已经在正确的位置上qsort(nums,l,left);qsort(nums,right,r);
}int getrandom(vector<int>&nums,int left,int right)
{int r=rand();return nums[r%(right-left+1)+left];//控制随机的下标是在每一个子数组内}

http://www.lryc.cn/news/600062.html

相关文章:

  • 免模型控制
  • 蓝桥杯java算法例题
  • 计算机网络(第八版)— 第2章课后习题参考答案
  • [NLP]多电源域设计的仿真验证方法
  • 数字化转型-AI落地金字塔法则
  • 【日志】unity俄罗斯方块——边界限制检测
  • 深度学习篇---图像数据采集
  • 【VLAs篇】06:从动作词元化视角谈VLA模型的综述
  • JavaSE-图书信息管理系统
  • 9 个优秀帮助中心案例:打造提升客户体验的自助支持系统
  • Allegro软件光绘文件Artwork到底如何配置?
  • 飞算JavaAI“删除接口信息” 功能:3 步清理冗余接口,让管理效率翻倍
  • Android Ntp系统校时流程
  • 互联网金融项目实战(大数据Hadoop hive)
  • Redis替代方案:腾讯云TDSQL-C内存优化实战,TPS秒上涨
  • App拉起:唤醒即达,告别繁琐操作
  • 百度快排技术分析的核心要素
  • 测试实时性内核参数配置
  • 【初识数据结构】CS61B中的快速排序
  • 洛谷 P11965 [GESP202503 七级] 等价消除-普及/提高-
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——5. 集成OpenCV:让程序拥有“视力”
  • WebGL入门:高斯模糊
  • Qt 网络编程进阶:HTTP 客户端实现
  • leetcode102:二叉树的层序遍历(队列实现)
  • 搜索--二分查找
  • haproxy七层代理(实验)
  • Excel导入数据库-01.构思
  • 4麦 360度定位
  • 力扣 hot100 Day55
  • lock 和 synchronized 区别