城市直播房产教育博客汽车
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

Java排序算法知多少

12月4日 飞虹塔投稿
  今天阿粉就来谈一下这个Java中的各种排序的算法,因为之前遇到了一个面试高级开发,结果竟然出了一个九九乘法表的题,阿粉当时听完读者说的,瞬间就明白是什么意思了,这感觉有点忽悠人,但是实际上却是面试官想要考察你的排序算法的事了,也有可能是真的无聊。排序算法
  什么是排序算法,实际上这个没有太多的说法,意思表达清楚就可以了,所谓排序,就是一串记录,按照其中的某个或某些关键字的大小,递增或递减地排列起来的操作。
  排序算法的种类可以说是比较的多样化了,对时间,对空间的效率,不同的排序算法的优缺点是不一样的,有些是用时间换空间的,有些是拿空间换时间的,今天阿粉就来一一列举一下。冒泡排序
  什么是冒泡排序呢?
  冒泡排序就是依次比较相邻的两个数,将小数放在前面,大数放在后面。
  就像一个泡泡,一个泡泡一样,直接往起漂。
  冒泡排序就是依次比较相邻的两个数,将小数放在前面,大数放在后面。
  实际上比较的过程就是这个样子的:
  第一次比较:
  首先比较第1个和第2个数,将小数放前面,大数放后面,然后比较第2个数和第3个数,小数放前面,大数放后面,然后一直比较到最后,这样,最大的一个数就放到了最后面了。
  第二次比较:
  首先比较第1个和第2个数,将小数放前面,大数放后面,然后比较到倒数第二个数,然后第二次比较结束,这样在最后一个位置的就是最大的,然后倒数第二个位置的是第二大的数。
  然后一直这样往下执行,第三次就是来取第三个数,这样依次循环,这样说大家肯定都是能理解的,假设需要排序的序列的个数是n,则需要经过n1轮,最终完成排序。在第一轮中,比较的次数是n1次,之后每轮减少1次。
  我们接下来使用代码来实现一下:publicstaticvoidmain(int〔〕a){需要比较n1轮for(inti0;ia。length1;i){根据a。lengthi1,每轮需要比较的次数逐轮减少1次for(intj0;ja。lengthi1;j){相邻数进行比较,符合条件进行替换if(a〔j〕a〔j1〕){tempa〔j〕;a〔j〕a〔j1〕;a〔j1〕}}}}插入排序
  插入排序的种类比较多直接插入排序二分插入排序希尔排序
  这些排序方式全都是属于插入式排序的,
  我们先来看看直接插入排序:
  比较的过程是这个样子的,数组的第二个数据开始往前比较,即一开始用第二个数和他前面的一个比较,如果符合条件则让他们交换位置。
  假如我们给定一个数组,我们要按照从小到大排序,数组为〔3,1,4,6,5,17,12,11〕这时候,第一步就是拿着1和3进行比较,如果1小于3,这个时候,就把1和3换个位置,〔1,3,4,6,5,17,12,11〕。
  接下来再用第三个数和第二个比较,符合则交换,但是此处还得继续往前比较,就是用4和3和1分别去比较,然后一直这么重复下去。直到把所有的数据都排列完之后,就得到了我们想要的结果,我们来写个代码看看是什么样子的。publicstaticvoidbasal(int〔〕array){从第二项开始if(arraynullarray。length2){}for(inti1;iarray。i){intcurarray〔i〕;cur落地标识,防止待插入的数最小倒序遍历,不断移位for(intji1;j1;j){if(curarray〔j〕){array〔j1〕array〔j〕;}else{array〔j1〕}}if(!flag){array〔0〕}}}}
  既然我们之前都说了,插入排序的方法有很多种,那么我们也得说说其他的插入排序,然后在看看他们都有什么不同的地方,大家说对不对呢?
  既然我们刚才都说了排序每次都要讲数组后移,但是我们之前的判断条件上却是可以优化出来的,这样优化优化的就衍生出来了其他的不同的插入排序,接下来我们就来看看这个二分查找插入排序。二分查找法插入排序
  优化直接插入排序的核心在于:快速定位当前数字待插入的位置。在一个有序数组中查找一个给定的值,最快的方法无疑是二分查找法,至少在阿粉的心中如果想到优化的时候肯定是第一时间选择的就是可不可以使用二分查找法呢?
  我们先来看看代码实现,然后再看看他有什么缺点,为啥有很多人都不选择使用二分查找插入排序。利用系统自带的二分查找法,定位插入位置不稳定排序publicstaticvoidoptimized(int〔〕array){if(arraynullarray。length2){}for(inti1;iarray。i){intcurarray〔i〕;int〔〕sortedArrays。copyOf(array,i);intindexArrays。binarySearch(sorted,cur);if(index0){index(index1);}for(intji1;jindex1;j){array〔j1〕array〔j〕;}array〔index〕}}
  在这其中,阿粉使用了系统自带的Arrays,然后进行了二分查找插入排序,为什么这么用呢?在JDK中提供了Arrays。binarySearch(),方法的入参需要将有序数组传递进去来进行实现,为什么不用这种方法呢?
  假如在排序之前,有两个数相等,但是在排序结束之后,它们两个有可能改变顺序这就是说明该排序算法具有不稳定性。这就是大家所说的稳定性。
  既然都有这种不稳定的排序,那是不是就应该存在稳定的排序呢?对没错,就是有,那么什么是稳定的排序呢?对,大家没有想错,冒泡排序就是稳定排序,因为冒泡排序只在相邻元素大小不符合要求时才调换他们的位置,它并不改变相同元素之间的相对顺序,因此它是稳定的排序算法。
  既然我们刚才说了这个排序中还有希尔排序,我们再来看看希尔排序。希尔排序
  说实话,阿粉第一次知道这个排序的时候,就想说,是不是一个叫做希尔的人改进的,结果,发现还真是,希尔排序,又叫做((缩小增量排序),因D。L。Shell于1959年提出而得名,实际上应该叫做ShellsSort。
  希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行依次直接插入排序。
  实际上就相当于先进行了一个简单的分组,将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次再将gap折半减小,循环上述操作;当gap1时,利用直接插入,完成排序。
  代码实现是这个样子的publicstaticvoidsort(int〔〕a){intlengtha。inth1;while(hlength3)h3h1;for(;h1;h3){for(inti0;ia。ih){for(j0;jh){if(a〔j〕a〔jh〕){inttempa〔j〕;a〔j〕a〔jh〕;a〔jh〕}}}}}选择排序
  选择排序(Selectionsort)是一种简单直观的排序算法。
  这个就比较简单了,为什么这么说,是因为他就是直接从未排序的序列中去找最小或者最大的元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
  实际上和冒泡排序在想法上有一丢丢的相似,但是就是不一样。
  我们看看代码是否实现:publicstaticvoidsort(int〔〕a){for(inti0;ia。i){选出之后待排序中值最小的位置for(intji1;ja。j){if(a〔j〕a〔min〕){}}最小值不等于当前值时进行交换if(min!i){inttempa〔i〕;a〔i〕a〔min〕;a〔min〕}}}
  既然阿粉都给大家列出了这几种排序,那么我们又回到一个问题上来了,排序这么多,怎么选择,为什么选择,这就又涉及到了时间复杂度和空间复杂度上面了,要么用空间换时间,要么用时间换空间。总结
  冒泡排序
  平均时间复杂度最好情况最坏情况空间复杂度O(n)O(n)O(n)O(1)
  直接插入排序
  平均时间复杂度最好情况最坏情况空间复杂度O(n)O(n)O(n)O(1)
  二分查找排序
  平均时间复杂度最好情况最坏情况空间复杂度O(n)O(n)O(n)O(1)
  希尔排序
  平均时间复杂度最好情况最坏情况空间复杂度O(nlog2n)O(nlog2n)O(nlog2n)O(1)
  选择排序
  平均时间复杂度最好情况最坏情况空间复杂度O(n)O(n)O(n)O(1)
  今天的排序就说到这里了,你学会了么?
搜索 投诉 评论 转载

我为手机写首歌手机歌你们还记得你们玩的第一代手机是什么?我第一次玩的BB机还有摩托罗拉的直板手机。《手机歌》走南闯北,渴了喝水;说东道西,智能手机;小米!三星!诺基亚。……聊聊git中的四大对象git总共包括四种对象类型:1、blobblob又称块对象,git中最基本的对象,一个文件的内容在git中以是二进制的文件存储git仓库中的,这个二进制文件就叫bl……想换一部两千元左右的手机,不打游戏,大神们帮忙推荐一下?realme,红米华为nova7,麒麟芯片,鸿蒙系统,2000左右,不打游戏,基本够用。我也想换手机了,这部oppor11用了5年,最近特别卡,特别是运行几个程序的……在IDC关于2022年中国ICT市场预测中看数据中心的机遇IDC2022年中国ICT市场十大预测具体内容如下:预测一:行业深度数字化加速,数字化产品与服务机会可期十四五规划明确提出:促进数字技术与实体经济深度融合,加快推进……中经评论科技范儿装扮冰雪盛会创新成果全民共享来源:中国经济网时光如水,生命如歌,奋进的中国与奥林匹克再度携手。如今,科技元素融入场馆建设、运动训练、冰雪产业,让奥运比赛更安全、更精确、更好传播,全方位展示出北京冬奥……电商快讯年货节,抖音直播观看达424亿人次,天猫13国外交官1。抖音好物年货节收官:直播间累计看播人次达424亿抖音好物年货节收官。活动战报显示,此次年货节直播总时长3171万小时,年货节商家自播总时长1393万个小时,直播间累计……担心行业垄断?美监管机构阻止显卡王者收购英国芯片企业法新社近日报道称,反对美国英伟达公司收购英国微处理器专家安谋科技公司的各国监管机构阵线,近期赢得了一个强有力的盟友美国竞争监管机构联邦贸易委员会。该机构与欧盟和英国的同行一样,……Java排序算法知多少今天阿粉就来谈一下这个Java中的各种排序的算法,因为之前遇到了一个面试高级开发,结果竟然出了一个九九乘法表的题,阿粉当时听完读者说的,瞬间就明白是什么意思了,这感觉有点忽悠人……智能机器人在新时代是否会代替人类?霍金的预言真的要实现了吗?个人观点不会代替人类,人工智能以及智能机器人是为了更好的服务生产与制造,工程师设计的机器人自然是按照人类的制定的规则和算法去运行。人力劳动被机器完全取代,社会被极少数人掌……首发天玑2000?红米K50Pro传来,5000mAh60倍最近的小米真的是新机不断,这个月也即将有两部新机上线,都是性价比十足的走量机型,其次就是关于Redmi的K50系列,有部分配置消息传出,此前大家都认为RedmiK50Pro搭载……比特币以太坊双双刷新高,以太坊市值超腾讯,比特币直追亚马逊11月9日早间,据Huobiglobal数据显示,加密货币BTC(下称比特币)涨逾1报67777美元枚的新高,总市值1。27万亿美元。ETH(下称以太坊)盘中涨逾1报4823美……日本的科技实力仅次于美国,为什么仍然没有高端芯片呢?日本半导体产业是被美国以市场为要挟逼迫日本主动换道的,日本是缺市场,缺量产规模,不是缺技术,三星为何能在内存屏幕上反超日本?因为韩国不计成本举国砸钱建生产线来支持三星扩产日本什……
苹果手机为什么不送充电头,是因为环保还是又当又立?现在最保值的华为手机是哪一部?怎么判定哪些网贷是否合法?耳鸣患者佩戴助听器后耳鸣能否改善?买手机还想要充电器?抱歉真送不了域乎加入金链盟,共建科技金融新模式畅快游戏竞技必备北通阿修罗3手柄新能源车的有力竞争者ID。4CROZZ苹果多家供应商限电停产怎么回事?iPhone13价格开始渐涨在南阳,你平时出行用哪个网约车平台?京东淘汰因家庭身体原因不拼搏的员工最新回应来了新游戏神机大曝光
如何绣十字绣心理学实验类论文蚂蚁庄园今日问题摆在店里的招财猫有举左右手两种形态举左手表示收费手机应用软件安全效果如何佛山岭南新天地一天游分得西花园送客招聘专业化是突破人力资源管理工作的重点孙中山出国护照之谜,竟由一份私人档案破解油脂造句用油脂造句大全百事焕新竞赛:百事数字和社会媒体全球总监的看法擦了造句用擦了造句大全幸福伤风感冒素保质期幸福伤风感冒素能放多久?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁