linux快速排序,快速排序_Linux编程_Linux公社-Linux系统门户网站

news/2024/5/17 11:26:22/文章来源:https://blog.csdn.net/weixin_35231615/article/details/116931254

思想

快速排序(quick sort)由C. A. R. Hoare在1962年提出。它的基本思想是:选择一个基准数(枢纽元),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于或等于基准数,另外一部分的所有数据都要大于或等于基准数,然后再按此方法对这两部分数据分别进行快速排序。

将数组 S 排序的基本算法由下列四步组成

如果 S 中元素个数是 0 或 1,则返回

取 S 中一元素 v,称之为枢纽元(pivot)

将S - {v}分成两个不相交集合:S1中的元素都小于或等于v,S2中的元素都大于或等于v

返回 { quickSort(S1) 后,继随 v,继而 quickSort(S2) }

枢纽元的选取

错误的做法

通常的、没有经过充分考虑的选择是将第一个元素或最后一个元素用作枢纽元。如果输入是随机的,那么这是可以接受的。但是如果输入是预排序的或是反序的,那么这样的枢纽元就产生一个劣质的分割,因为所有的元素不是都被划入了 S1 就是被划入了 S2。实际上,如果第一个元素用作枢纽元而且输入是预先排序的,那么快速排序花费的时间将是二次的。

pivot = A[right];

安全的做法

一种安全的做法是随机选取枢纽元。一般来说这种策略非常安全,因为随机的枢纽元不可能总在接连不断地产生劣质的分割。另一方面,随机数的生成一般代价昂贵,根本减少不了算法其余部分的平均运行时间。

pivot = Random(left, right);

exchange A[right] with pivot

三数中值分割法(Median-of-Three Partitioning)

一组 N 个数的中值是第 ⌈ N / 2⌉ 个最大的数。枢纽元的最好的选择是数组的中值。一般的做法是使用左端、右端和中心位置上的三个元素的中值作为枢纽元。下述函数将枢纽与置于最右边第二个位置。由于最左边的元素小于枢纽元、最右边的元素大于枢纽元,使得双向分割时i、j不会超出边界。

ElementType Median3(ElementType a[],intleft,intright){

int center = (left + right) / 2;

//sort a[left], a[center] and a[right]

if (a[left] > a[center])

Swap(&a[left], &a[center]);

if (a[left] > a[right])

Swap(&a[left], &a[right]);

if (a[center] > a[right])

Swap(&a[center], &a[right]);

Swap(&a[center], &a[right - 1]); //hide pivot

return a[right - 1]; //return pivot

}

分割策略

在分割阶段要做的就是把所有小元素移到数组的左边而把所有大元素移到数组的右边。调用该算法前应该使用好的策略选取枢纽元,并将其与最右边的元素交换(单向分割)或倒数第二个元素交换(双向分割),使其离开要被分割的区域: A[left] 到 A[right - 1] 或 A[left] 到 A[right - 2]。

单向分割

Partition(A, left, right)

pivot = A[right] //枢纽元位于最右边

i = left - 1

for j = left to right - 1

if(A[j] <= pivot)

i++

if(i != j )

exchange A[i] with A[j]

exchange A[i + 1] with A[right]

return i + 1

双向分割

pivot = Median3(a, left, right); //使用三数中值分割法获取枢纽元

i = left;j = right - 1;

for (; ; )

{

while (a[++i] < pivot) {}

while (a[--j] > pivot) {}

if (i < j)

Swap(&a[i], &a[j]);

else

break;

}

Swap(&a[i], &a[right - 1]); //restore pivot

算法主体

算法中的CUTOFF用于分辨排序的规模,因为当排序规模过小时宜采用直接插入排序。

#define CUTOFF 3

voidQuickSort(ElementType a[],intleft,intright){

int i, j;

ElementType pivot;

if (left + CUTOFF <= right)

{

pivot = Median3(a, left, right);

i = left; j = right - 1;

for (; ; )

{

while (a[++i] < pivot) {}

while (a[--j] > pivot) {}

if (i < j)

Swap(&a[i], &a[j]);

else

break;

}

Swap(&a[i], &a[right - 1]); //把枢纽元的位置恢复为两个集合的中间

QuickSort(a, left, i - 1);

QuickSort(a, i + 1, right);

}

else

InsertionSort(a + left, right - left + 1);

}

0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

php网站漏洞挖掘,零基础学习挖掘PHP网站漏洞

教程介绍本套课程&#xff0c;分为三个阶段&#xff1a;第一阶段&#xff1a;基础篇 学习PHP开发的基础知识&#xff0c;对PHP常见的漏洞进行分析&#xff0c;第二阶段&#xff1a;进阶篇 实战PHP漏洞靶场&#xff0c;了解市面上的PHP主流网站开发技术&#xff0c;并对市面上的…

pypark hive 开启动态分区_网站PV分析(Hive)

之前我们做过《java mapreduce实现网站PV分析》&#xff0c;这次我们可以用hive分析一些需求指标提出需求&#xff1a;统计分析24小时各个时段的pv和uv分析&#xff1a;(1) pv统计总的浏览量 count(url)(2) uv统计去重 count(distinct guid)(3) 获取时间字段&#xff0c;日期和…

利用huffman编码对文本文件进行压缩与解压_宝塔面板LNMP开启Brotli压缩,可提高网站加载速度...

说明&#xff1a;Brotli是Google推出的开源压缩算法&#xff0c;通过变种的LZ77算法、Huffman编码以及二阶文本建模等方式进行数据压缩&#xff0c;与其他压缩算法相比&#xff0c;它有着更高的压缩效率&#xff0c;性能也比我们目前常见的Gzip高17-25%&#xff0c;可以帮我们更…

js修改json文件_静态网站生成器之React框架Gatsby (三)连接json数据源

前面一篇&#xff0c;我们讲到了替换首页的模板&#xff0c;用antd的首页模板页面。这一篇&#xff0c;我们将使用gatsby的数据源功能&#xff0c;把首页的一些数据从模板页面的js中剥离出来。这里我们将使用json文件作为gatsby的数据源&#xff0c;所以我们首先需要安装依赖的…

小虾视频网站广告屏蔽器 V 5.0

本软件用于屏蔽一些视频网站的广告&#xff0c;也具备屏蔽一些恶意网站的作用&#xff01;如过你发现在电脑正常的情况下有些网友打开开&#xff0c;那是因为屏蔽的原因&#xff0c;只要单击一键还原广告就OK了&#xff01;~打开软件后不要老是点击不然容易出错&#xff01;要是…

当前网站设计风格的发展趋势!

这篇文章翻译至&#xff1a;[url]http://www.webdesignfromscratch.com/current-style.cfm[/url]它总结了一些当前网站设计风格的发展趋势。但是我得先提一句&#xff0c;它说的都是西方网站&#xff0c;未必适合我们中国网站的情况和中国网民的审美观。如果能给你一点点参考和…

网站地图(sitemap)在线生成

网站地图在线生成其实也就是sitemap在线生成&#xff0c;在线生成网站地图&#xff08;sitemap&#xff09;的方式其实就两种&#xff1a; 一是、网站后台有sitemap网站地图生成功能&#xff1b; 二是、三方工具从一个入口地址&#xff0c;实现全站地址抓取分析。 如果是网站…

在线地图制作网站

网站地图Sitemap的好处是很多的&#xff0c;对SEO而言&#xff0c;网站地图起到的作用是快速提交链接&#xff0c;加速收录。当网站的层级关系很深的时候&#xff0c;没有网站地图&#xff0c;完全靠搜索引擎比如百度自己去抓取链接&#xff0c;速度是很慢的。所以需要主动让百…

百度、熊掌号、移动专区网站主动推送,网页实时监控解决方案

在网站制作完成之后&#xff0c;很多站长都会使用百度站长工具进行网站内容的自动推送&#xff0c;该功能对网站优化&#xff0c;快照更新以及文章收录都有非常好的提升效果&#xff0c;同时通过实现最新熊账号文章的主动推送也能实现原创文章的保护&#xff0c;那么如何实现百…

网页内容监控 - 怎么才能做到网站内容实时推送百度?

运用业界领先的爬虫技术&#xff0c;判断页面内容是否有新内容产出&#xff0c;并过滤非站内内容,然后将内容链接推送至百度各个数据推送接口&#xff08;如熊掌号、移动专区等&#xff09;。 网页内容监控是什么&#xff1f; 网页内容监控是指对网站的指定页面进行定时扫描&…

java https 导入证书_如何把Https网站中的安全证书导入到java中的cacerts证书库

展开全部在项目开发中,有时会遇到62616964757a686964616fe4b893e5b19e31333337613832SSL证书导入&#xff0c;把SSL证书导入java中的cacerts证书库其实很简单&#xff0c;方法如下&#xff1a;第一步&#xff1a;找到安装了SSL证书的网站&#xff0c;点击HTTPS加密协议下载SSL证…

java linux u盘_创建启动U盘或移动硬盘 - 基于Fedora 14搭建高效稳定的Java开发环境_Linux教程_Linux公社-Linux系统门户网站...

创建启动U盘或移动硬盘在这里我们选择Fedora 14 x64为例&#xff0c;其它版本安装过程大同小异。因光驱逐渐淘汰&#xff0c;这里我们选择以U盘或移动硬盘作为安装方式(如果选择光驱方式安装&#xff0c;可以跳过此节&#xff0c;直接将下载的文件刻盘后进入本系列的第三节)&am…

安卓ios混合开发技术_app分析有多少种?app开发技术分析的4种方法 | 免费SEO诊断咨询...

app开发多少钱&#xff1f;开发一个app需要哪些流程&#xff1f;现在市场上的app开发方式&#xff0c;可以分为4种&#xff1a;原生app开发、Web app开发、混合app开发以及免编程app开发。不同app方式的开发流程&#xff0c;开发出来的app功能开发周期及成本不同&#xff0c;大…

discuz修改用户uid_[建站教程]Discuz数据库迁移的详细步骤

在网站发展到一定的阶段后&#xff0c;原先的数据库可能已经跟不上容量和速度的要求。这时&#xff0c;我们就要把数据库切换到其他的高性能库上了。那么如何实现网站数据的迁移呢&#xff1f;大概分为三步&#xff1a;&#xff08;1&#xff09;把原数据库中的数据倒出来。&am…

百度排名批量查询_企业网站核心关键词排名消失,什么原因?

自从建立了SEO你问问答的圈子&#xff0c;在很长时间里&#xff0c;我们接触到最多的问题就是为什么我的品牌词排名丢失&#xff0c;我的品牌词怎么搜索不到等相关问题。长沙网站设计|长沙网站制作|长沙app开发公司|长沙做网站|长沙公众号开发公司|长沙网页设计公司|享趣网络​…

兄弟连java网站_IT兄弟连 Java Web教程 URI、URL

原标题&#xff1a;IT兄弟连 Java Web教程 URI、URLURI介绍URI(Uniform Resource Identifier)&#xff0c;是统一资源标识符的缩写&#xff0c;是一个用于标识某一个Web资源名称的字符串&#xff0c;该标识允许用户对任何资源通过特定的协议进行交互。Web上可用的每种资源&…

计算机原理WR是什么,8086的引线-微计算机原理-电子发烧友网站

2.5 8086的引线本节概述概念1&#xff1a;有40个引脚&#xff0c;其中地址线有20根&#xff0c;16根分时复用的数据线&#xff0c;还有控制线&#xff0c;如图2-8所示。某些引脚上的信号&#xff0c;在不同时刻具有不同的意义。例如&#xff0c;AD15~AD0&#xff0c;在某些时候…

为什么我php总聘不上,我的phpweb建站经验:[7]招聘、反馈设置

下面我们看看招聘和反馈模块的设置&#xff0c;由于招聘和反馈模块都涉及到表单的设置&#xff0c;所以这一篇将同时做介绍&#xff0c;以免重复。点击招聘模块&#xff0c;我们可以看到左侧的导航栏目&#xff0c;点选职位发布&#xff0c;即可根据表单提交需要招聘的职位内容…

wordpress 最强免插件纯代码sitemap.xml网站地图制作

wordpress 建站我一直是拒绝插件的。 最近想弄个sitemap.xml网站地图文件&#xff0c;不用插件的方法网上有很多相关的代码&#xff0c;但其实好多并不好用。 有的可能是没有全站网站地图&#xff0c;而有的.xml后缀名需要伪静态设置&#xff0c;特别麻烦。 于是&#xff0c;空…

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

ActiveX控件用于Web的过程是将控件嵌入主页中&#xff0c;用户通过浏览器访问该主页时&#xff0c;将主页中的控件下载&#xff0c;并在用户机器上注册&#xff0c;以后就可在用户的浏览器上运行。控件下载一次后就驻留在用户本地机器上&#xff0c;下次再访问相同的主页时&…