快速排序quicksort算法优化

1.基本想想

  • 快速排序使用分治的思想

  • 通过一趟排序将待排序列分割成两部分,其中一部分所有元素均比基准大,另一部分均比基准小

  • 分别对这两部分元素继续进行排序,以达到整个序列有序

2.快排的步骤

  • 1.选择基准
    在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot)
  • 2.分割操作
    在基准左边的元素都比该基准小,在基准右边的元素都比基准大
  • 3.递归
    递归地对两个序列进行快速排序,直到序列为空或者只有一个元素

3.基准的选取

  • 固定位置
    取序列的第一个或最后一个元素作为基准
int pval = arr[left];
  • 随机选取基准
    取待排序列中任意一个元素作为基准
int pval = arr[rand()%(right-left)+left];
  • 三数取中
    对待排序序列中low、mid、high三个位置上数据进行排序,取他们中间的那个数据作为枢轴
void selectmedianofthree(int *arr, size_t left, size_t right) 
{size_t mid = left + (right - left)/2;  //中部数据的下标if(arr[mid]>arr[right]){swap(arr[mid],arr[right]);}if(arr[left]>arr[right]){swap(arr[left],arr[right]);}if(arr[mid]>arr[left]){swap(arr[mid],arr[left]);  //把中间大小的数值放到首位,取为基准}
}

4.快排算法优化

  • 当待排序序列的长度分割到一定大小后,使用插入排序或者其它排序(数组短的时候,快排分割效率不高)
 if(left >= right){return;}else if(right-left > 0 && right-left < 20)  
//数组长度较小时,调用希尔排序,减少调用快排{size_t len = right - left + 1;shellsort(len, &arr[left]); //数组首地址为&arr[left]}else{qsort(****);}
  • 在一次分割结束后,可以把与基准p相等的元素聚在一起,继续下次分割时,不用再对与基准p相等元素分割
void partion(int *arr, size_t left, size_t right, size_t &lessPnum, size_t &largePnum)//数据分段
{selectmedianofthree(arr,left,right);  //找出中间大小的哨兵,让分段尽量均匀,提高效率int pval = arr[left];  //中间大小的数赋值给哨兵int *temp = new int [right-left+1];  //开辟堆空间存放临时数组int tempLindex=0, tempRindex = right-left;  //临时数组的首末位下标for(int i = left+1; i <= right; ++i){if(pval > arr[i]) //比哨兵小的放在左边,从左边首位往中间写入,记录下比哨兵小的有多少个{temp[tempLindex++] = arr[i];++lessPnum;}if(pval < arr[i])  比哨兵大的放在右边,从右边末位中间写入,记录下比哨兵大的有多少个{temp[tempRindex--] = arr[i];largePnum++;}}for( ; tempLindex <= tempRindex; ++tempLindex)//中间还未被写入的位置,写入哨兵(哨兵可能是多个相同的值){temp[tempLindex] = pval;}for(int i = left, j=0; i <= right; ++i){arr[i] = temp[j++]; //把分好段的数组写回原数组{ [小于哨兵的], [等于哨兵的], [大于哨兵的] }}delete [] temp; //释放临时数组temp = NULL;  //指针置空
}

5.效率比较

同样的环境下,运行时间(s)
快排效率比较

参考文献

https://blog.csdn.net/hacker00011000/article/details/52176100

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

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

相关文章

阿里P8架构师谈:Dubbo的详细介绍、设计思路、以及4大适用场景

Dubbo是什么&#xff1f; Dubbo是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。 简单的说&#xff0c;dubbo就是个服务框架&#xff0c;如果没有分布式的需求&#xff0c;其实是不需要用的&#xff0c;只有…

巨省显存的重计算技巧在TF、Keras中的正确打开方式

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;苏剑林&#xff08;来自追一科技&#xff0c;人称“苏神”&#xff09;前言在前不久的文章《BERT重计算&#xff1a;用22.5%的训练时间节省5倍的显存开销&#xff08;附代码&#xff09;》中介绍了一个叫做“重计算”的…

论文浅尝 | 用可微的逻辑规则学习完成知识库推理

Citation&#xff1a;Fan Yang,Zhilin Yang, William W. Cohen. Differentiable Learning of Logical Rules for Knowledge Base Reasoning. ICLR 2017.动机本文提出了一个可微的基于知识库的逻辑规则学习模型。现在有很多人工智能和机器学习的工作在研究如何学习一阶逻辑规则&…

一点关于cloze-style问题的简谈

一个小任务&#xff1a;给出一个问题和诺干个候选句子&#xff0c;从候选句子中选出答案&#xff0c;有没有好的实现方案&#xff1f; 一个小任务&#xff1a;类似于&#xff1a;“中国最大的内陆湖是哪个&#xff1f;”给出候选句子1.”中国最大的内陆湖&#xff0c;就是青海湖…

中文词语概念上下位图谱项目

HyponymyExtraction 项目地址&#xff1a;https://github.com/liuhuanyong/HyponymyExtraction HyponymyExtraction and Graph based on KB Schema, Baike-kb and online text extract, 基于知识概念体系&#xff0c;百科知识库&#xff0c;以及在线搜索结构化方式的词语上下位…

POJ 1007 DNA排序解题

题目链接 http://poj.org/problem?id1007 C代码实现 #include<string> #include<iostream> using namespace std; struct DNAdata //定义结构体 {char name[51];double sum;DNAdata(){sum 0;} }; void swapDNA(DNAdata *a, DNAdata *b) {DNAdata tempDNA;tempDN…

DeepMatch:用于推荐广告的深度召回匹配算法库

一只小狐狸带你解锁 炼丹术&NLP 秘籍前言今天介绍一下我们的一个开源项目DeepMatch&#xff0c;提供了若干主流的深度召回匹配算法的实现&#xff0c;并支持快速导出用户和物品向量进行ANN检索。非常适合同学们进行快速实验和学习&#xff0c;解放算法工程师的双手&#xf…

史上最全Spring面试71题与答案

1.什么是spring? Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发&#xff0c;并通过POJO为基础的编程模型促进良好的编程习惯。 2.使用Spring框架的好处…

论文浅尝 | 近期论文精选

本文转载自公众号 PaperWeekly, 对我们近期的论文浅尝进行了精选整理并附上了相应的源码链接&#xff0c;感谢 PaperWeekly&#xff01;TheWebConf 2018■ 链接 | https://www.paperweekly.site/papers/1956■ 解读 | 花云程&#xff0c;东南大学博士&#xff0c;研究方向为自然…

海马体what where记忆推理模型

Generalisation of structural knowledge in theHippocampal-Entorhinal systemhttps://www.groundai.com/project/generalisation-of-structural-knowledge-in-the-hippocampal-entorhinal-system/海马 - 内嗅系统结构知识的泛化 实体概念信息和位置及虚拟位置信息组成记忆保存…

快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)

文章目录1.只申请一次内存&#xff0c;避免多次递归调用时反复的申请和释放内存&#xff0c;提高程序运行效率2.不申请内存&#xff0c;在原数组上直接排序优化比较总结对链接中快速排序进行代码优化 https://blog.csdn.net/qq_21201267/article/details/80993672#t6 1.只申请…

在深度学习顶会ICLR 2020上,Transformer模型有什么新进展?

一只小狐狸带你解锁炼丹术&NLP秘籍大数据文摘出品来源&#xff1a;medium编译&#xff1a;一一、AndyICLR是机器学习社群最喜爱的会议平台之一。如今&#xff0c;机器学习领域的会议已成为预印本里论文质量的标志和焦点。但即使这样&#xff0c;论文的发表数量还是越来越庞…

领域应用 | 人工智能+知识图谱:如何规整海量金融大数据?

本文转载自公众号&#xff1a;恒生技术之眼。21世纪以来&#xff0c;人类社会信息资源的开发范围持续扩大&#xff0c;经济、社会信息随着经济活动加剧得到空前的开发&#xff0c;信息资源总量呈爆炸式增长&#xff0c;我们从最初的“信息匮乏”一步踏入到“信息过量”时代。个…

神经网络不应视为模型,推理过程当为机器学习问题一等公民

首发于论智关注专栏写文章神经网络不应视为模型&#xff0c;推理过程当为机器学习问题一等公民编者按&#xff1a;Microsoft Semantic Machines资深研究科学家、UC Berkeley计算机科学博士Jacob Andreas指出&#xff0c;神经网络不应视为模型&#xff0c;因为神经网络的模型和推…

2019最全BAT资深Java面试题答案合集,建议收藏~

马上进入求职招聘高峰&#xff0c;总结了一份BAT&#xff08;阿里、百度等&#xff09;资深Java相关的面试题答案合集给到大家。 该板块的各面试章节&#xff0c;后续会持续迭代更新最新一线互联网公司的面试题目&#xff0c;建议收藏该页面&#xff0c;不定期更新查看~ Java…

中国古代诗词文本挖掘项目

PoemMining 项目地址&#xff1a;https://github.com/liuhuanyong/PoemMining Chinese Classic Poem Mining Project including corpus buiding by spyder and content analysis by nlp methods, 基于爬虫与nlp的中国古代诗词文本挖掘项目 项目介绍 中国古代诗词文化无疑是…

推荐系统的价值观

一只小狐狸带你解锁炼丹术&NLP秘籍 前言 推荐系统作为满足人类不确定性需求的一种有效工具&#xff0c;是具有极大价值的&#xff0c;这种价值既体现在提升用户体验上&#xff0c;又体现在获取商业利润上。对绝大多数公司来说&#xff0c;提升用户体验的最终目标也是为了获…

POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)

POJ 1003 题目链接 http://poj.org/problem?id1003 大意&#xff1a;长度1/21/3…1/n&#xff0c;给定长度值&#xff0c;求n #include<iostream> using namespace std; int main() {float len 0,sum;int n;while(cin >> len && len ! 0){for(n2,sum0;s…

论文浅尝 | 远程监督关系抽取的生成式对抗训练

动机远程监督关系抽取方法虽然可以使用知识库对齐文本的方法得到大量标注数据&#xff0c;但是其中噪声太多&#xff0c;影响模型的训练效果。基于 bag 建模比基于句子建模能够减少噪声的影响&#xff0c;但是仍然无法克服 bag 全部是错误标注的情形。为了换机噪声标注&#xf…

谷歌最强NLP模型BERT官方代码来了!GitHub一天3000星

新智元报道 来源&#xff1a;GitHub 作者&#xff1a;Google Research 编辑&#xff1a;肖琴 【新智元导读】谷歌AI团队终于开源了最强NLP模型BERT的代码和预训练模型。从论文发布以来&#xff0c;BERT在NLP业内引起巨大反响&#xff0c;被认为开启了NLP的新时代。 BERT的官方…