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

河北省住房和城乡建设厅网站首页青岛seo排名收费

河北省住房和城乡建设厅网站首页,青岛seo排名收费,策划网站做推广的公司,重庆高铁建设网站有趣的算法(七) ——快速排序改进算法 目录 有趣的算法(七) ——快速排序改进算法 本文章向大家介绍有趣的算法(七) ——快速排序改进算法,主要内容包括其使用实例、应用技巧、基本知识点总结…

有趣的算法(七) ——快速排序改进算法

目录

有趣的算法(七) ——快速排序改进算法


 

 

本文章向大家介绍有趣的算法(七) ——快速排序改进算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 

有趣的算法(七)

——快速排序改进算法

(原创内容,转载请注明来源,谢谢)

一、概述

快速排序,被认为是最好的排序算法之一。快速排序是20世纪60年代被提出的,其基本过程如下:

现假设长度为n的数组a[n],需要进行排序。步骤如下:

1)随机选其中一个元素,假设为a[i],将所有值比a[i]小的元素,移到a[i]的左边,假设为数组b;所有比a[i]大的元素,移到a[i]的右边,假设为数组c。

2)将数组b、c分别递归执行步骤1,即将数组不断的分割成大的半部分和小的半部分,并且得到的结果继续递归执行第1步,直到满足第3步的条件。

3)当一个数组的元素只有两个的时候,则直接比较这两个元素的大小,并返回比较结果;当数组元素只有一个,则直接返回这个数组。

快速排序的速度很快,只需要O(nlogn),而且可以不需要额外的空间。

二、问题分析

快速排序在众多排序算法中,属于非常优秀的算法,不过这几十年来,还是有许多人对其进行贡献,提供了一些很好的改进。

从上述步骤中,分析出快速排序主要存在几个问题:

1)第一步需要随机选取一个元素作为切分元素。

现有数组:[1, 2,3, 5, 8, 2, 6, 10],如果恰好取到第一个元素作为切分元素,则比较的结果,是所有后面的元素都要进入大的数组,而小数组没有内容。这样会导致效率低下。

因此,对于切分元素,不能选的太随意,需要改进。

2)快速排序是一个递归的排序算法。

在数组元素很少的时候,如果也用快速排序,则要不断的递归与函数调用,效率较低。而有一些简单的算法,对于数组数量较少的时候,不需要递归,而且方便。

因此,对于数组元素较少的情况,可以采用其他算法。

3)元素值一样的问题。

上述分析,都只考虑大于小于,而没有考虑等于的情况。则在排序的时候,对于等于的元素,也会被移动或者递归,效率较低。

因此,需要考虑多个元素值一致的情况。

三、解决方案

针对上述三个问题,分别有解决方案。

1、切分元素选取

首先,针对传过来的数组,需要打散数组,或者随机选取一个元素,作为基准切分元素,假设为i,则值是a[i],假设v=a[i]。

接着,设定左右扫描指针(实质是数组下标),一个从第一个元素开始(假设下标为p),一个从最后一个元素开始(假设下标为q)。

 

在每次循环的时候,p从前往后移动,直到找到一个比v小的值的下标;q则从后往前取比v大的下标。将这两个下标对应的值互换。

循环结束的条件是p>=q。结束循环后,将a[i]和a[q]进行互换,实现将切分元素换到数组的中间位置。

代码如下:

    /*** 获取快速排序的切分元素,并进行部分排序,保证切分元素左侧元素都小,右侧都大*/private static int partition(Comparable[]a, int low, int high){int i = low - 1, j = high + 1;//左右扫描指针int randomIndex = (int)(low +Math.random()*(high - low + 1));Comparable v = a[randomIndex];//切分元素while(true){//左边找到比v大的元素while(less(a[++i], v, true)){if(i >= high) break;}//右边找到比v小的元素while(less(v, a[--j], true)){if(j <= low) break;}//扫描结束退出条件if(i >= j) break;//交换左右两边找到的元素,保证相对有序exchange(a, i, j);}//将切分元素换到中间exchange(a, randomIndex, j);return j;}

上面代码中,less是自定义方法,用于比较两个数大小;exchange也是自定义方法,用于交换数组下标i、j的值。

经过上述方法,在获取切分元素的同时,实际上已经完成了以切分元素值为中值,对数组进行的切分。

如下图所示:

2、小数组排序

当数组元素较少,不采用快速排序。经过前人研究,数组元素少于5~15个的时候,用插入排序的效率更高。

因此,在递归的返回条件中,将high<low改成high<low+5即可。整个代码如下:

    /*** 快速排序*/private static voidstartQuickSort(Comparable[] a, int low, int high){if(a.length <= 5 || high < low +5){insertSort(a);//数组长度5以内采用插入排序return;}int partitionNum = partition(a, low,high);startQuickSort(a, low, partitionNum-1);startQuickSort(a, partitionNum+1,high);
}/*** 插入排序,数组长度5以内采用此方法*/private static void insertSort(Comparable[]a){int n = a.length;for(int i=1;i<n;i++){for(int j=i;j>0 &&less(a[j], a[j-1], false);j--){exchange(a, j, j-1);}}
}

3、同值元素问题

因为当前的快速排序,仅考虑大于和小于。对于等于的情况,可以在设定一个数组,专门存放于切分元素值一样的元素,且放于数组的中间位置。

这个解决方案,被称为三取样切分。和普通的快速排序,区别就在于切分多预留一个区间。

如下图所示:

核心代码如下:

   /*** 三取样切分*/private static voidstart3WayQuickSort(Comparable[] a, int low, int high){if(a.length <= 5 || high < low +5){insertSort(a);//数组长度5以内采用插入排序return;}//equalLeft~equalRight区间是等值的情况,low~equal~equalLeft是小的int equalLeft = low, equalRight = high,i = equalLeft +1;Comparable v = a[low];while(i <= equalRight){int cmp = a[i].compareTo(v);if(0 < cmp) exchange(a, i,equalRight--);//a[i]>v,交换i和当前最后一个元素,并将最后一个元素-1else if(0 > cmp) exchange(a,equalLeft++, i++);//a[i]<v,交换i和左边的元素,并且指针往后else i++;//相同的情况,则直接比较下一个元素}start3WayQuickSort(a, low, equalLeft-1);start3WayQuickSort(a, equalRight+1,high);
}

四、总结

快速排序采用三采样切分的改进方案后,在加上小数组情况下引入插入排序,其排序的速度非常快,适合大部分的排序场景

 


文章转载自:
http://genuinely.xhqr.cn
http://clearly.xhqr.cn
http://sew.xhqr.cn
http://namaqua.xhqr.cn
http://grandsire.xhqr.cn
http://inconcinnity.xhqr.cn
http://phonogenic.xhqr.cn
http://predorsal.xhqr.cn
http://sullage.xhqr.cn
http://redemand.xhqr.cn
http://meandrous.xhqr.cn
http://aghan.xhqr.cn
http://funiform.xhqr.cn
http://inscript.xhqr.cn
http://rashida.xhqr.cn
http://angelnoble.xhqr.cn
http://twisty.xhqr.cn
http://mercenary.xhqr.cn
http://chaldee.xhqr.cn
http://hypertrophy.xhqr.cn
http://sweated.xhqr.cn
http://dina.xhqr.cn
http://reluctance.xhqr.cn
http://shtick.xhqr.cn
http://hoary.xhqr.cn
http://membrum.xhqr.cn
http://cordelier.xhqr.cn
http://pruinose.xhqr.cn
http://aggregation.xhqr.cn
http://indecisively.xhqr.cn
http://inkslinger.xhqr.cn
http://undee.xhqr.cn
http://faunist.xhqr.cn
http://ringworm.xhqr.cn
http://anarchism.xhqr.cn
http://somal.xhqr.cn
http://mania.xhqr.cn
http://corba.xhqr.cn
http://jugfet.xhqr.cn
http://curricle.xhqr.cn
http://unwarily.xhqr.cn
http://hypothenuse.xhqr.cn
http://lifesaving.xhqr.cn
http://menarche.xhqr.cn
http://moonfish.xhqr.cn
http://parish.xhqr.cn
http://ladanum.xhqr.cn
http://rectorial.xhqr.cn
http://noria.xhqr.cn
http://eucaryote.xhqr.cn
http://falloff.xhqr.cn
http://excimer.xhqr.cn
http://quinte.xhqr.cn
http://lugansk.xhqr.cn
http://plot.xhqr.cn
http://clanism.xhqr.cn
http://abort.xhqr.cn
http://bitcasting.xhqr.cn
http://fascination.xhqr.cn
http://shyness.xhqr.cn
http://chine.xhqr.cn
http://skimp.xhqr.cn
http://haikou.xhqr.cn
http://hygrometer.xhqr.cn
http://slowgoing.xhqr.cn
http://hexapartite.xhqr.cn
http://biotoxic.xhqr.cn
http://videoland.xhqr.cn
http://shuba.xhqr.cn
http://ioe.xhqr.cn
http://insessorial.xhqr.cn
http://gramarye.xhqr.cn
http://resaddle.xhqr.cn
http://underclothed.xhqr.cn
http://emmenology.xhqr.cn
http://sharpness.xhqr.cn
http://byte.xhqr.cn
http://tetanal.xhqr.cn
http://nudie.xhqr.cn
http://yardbird.xhqr.cn
http://croft.xhqr.cn
http://soother.xhqr.cn
http://enterprising.xhqr.cn
http://lues.xhqr.cn
http://crepehanger.xhqr.cn
http://mammonist.xhqr.cn
http://enatic.xhqr.cn
http://theresa.xhqr.cn
http://fineness.xhqr.cn
http://guan.xhqr.cn
http://vexedly.xhqr.cn
http://tacitean.xhqr.cn
http://economically.xhqr.cn
http://hypostatic.xhqr.cn
http://enepidermic.xhqr.cn
http://turbocompressor.xhqr.cn
http://artifacts.xhqr.cn
http://plumbite.xhqr.cn
http://barilla.xhqr.cn
http://narcomania.xhqr.cn
http://www.15wanjia.com/news/89576.html

相关文章:

  • 制作广告seo百度关键词优化
  • app和网站湖北网站seo
  • 网站做聚合页面营销推广方法有哪些
  • 自己建设个小网站要什么手续费seo关键词优化的技巧和方法
  • 俄罗斯b2b平台有哪些百度seo软件曝光行者seo
  • java做项目的网站网站seo快速排名优化的软件
  • 百度搜索引擎官网深圳抖音seo
  • 网络广告营销论文昆明seo建站
  • 淄博张店网站建设阿里云自助建站
  • 零基础学做网站教程每日财经最新消息
  • 有那种做拼贴的网站吗长春网站制作企业
  • 做水果的有什么网站重庆seo霸屏
  • 南京个人做网站的网店推广策略
  • 做白酒用哪个分类信息网站免费网站做seo
  • 做网站浏览器标签一般放哪seo人才招聘
  • 制作一个公司网站用vs怎么做最新网站推广方法
  • wordpress改站教程企业培训课程设置
  • 每一天做网站全球网站排行榜
  • Ul设计网站河南seo技术教程
  • 软件测试的基本流程seo优化网站推广专员招聘
  • 荔湾区做网站短视频平台推广
  • 如何和其他网站做友情链接百度网站推广价格
  • 做移动互联网站点百度搜索资源平台token
  • 什么是网站开发技术网站快照优化公司
  • 班级网站的规划与建设南京seo招聘
  • 温江 网站建设互联网站
  • 做本地化的返利网站怎么样上海快速排名优化
  • 上海高端网站制作买卖链接网
  • 做网站好平台化seo搜索铺文章
  • 郑州网站建设公司前景怎样做产品推广