范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java排序算法知多少

  今天阿粉就来谈一下这个 Java 中的各种排序的算法,因为之前遇到了一个面试高级开发,结果竟然出了一个 九九乘法表的题,阿粉当时听完读者说的,瞬间就明白是什么意思了,这感觉有点忽悠人,但是实际上却是面试官想要考察你的排序算法的事了,也有可能是真的无聊。  排序算法
  什么是排序算法,实际上这个没有太多的说法,意思表达清楚就可以了,所谓排序,就是一串记录,按照其中的某个或某些关键字的大小,递增或递减地排列起来的操作。
  排序算法的种类可以说是比较的多样化了,对时间,对空间的效率,不同的排序算法的优缺点是不一样的,有些是用时间换空间的,有些是拿空间换时间的,今天阿粉就来一一列举一下。  冒泡排序
  什么是冒泡排序呢?
  冒泡排序就是依次比较相邻的两个数,将小数放在前面,大数放在后面。
  就像一个泡泡,一个泡泡一样,直接往起漂。
  冒泡排序就是依次比较相邻的两个数,将小数放在前面,大数放在后面。
  实际上比较的过程就是这个样子的:
  第一次比较:
  首先比较第1个和第2个数,将小数放前面,大数放后面,然后比较第2个数和第3个数,小数放前面,大数放后面,然后一直比较到最后,这样,最大的一个数就放到了最后面了。
  第二次比较:
  首先比较第1个和第2个数,将小数放前面,大数放后面,然后比较到倒数第二个数,然后第二次比较结束,这样在最后一个位置的就是最大的,然后倒数第二个位置的是第二大的数。
  然后一直这样往下执行,第三次就是来取第三个数,这样依次循环,这样说大家肯定都是能理解的,假设需要排序的序列的个数是n,则需要经过n-1轮,最终完成排序。在第一轮中,比较的次数是n-1次,之后每轮减少1次。
  我们接下来使用代码来实现一下:   public static void main(int[] a) {         int temp;         //需要比较n-1轮         for (int i = 0; i < a.length-1; i++) {             //根据a.length-i-1,每轮需要比较的次数逐轮减少1次             for (int j = 0; j < a.length-i-1 ; j++) {                 //相邻数进行比较,符合条件进行替换                 if (a[j] > a[j+1]) {                     temp = a[j];                     a[j] = a[j+1];                     a[j+1] = temp;                 }             }         }     }      插入排序
  插入排序的种类比较多  直接插入排序  二分插入排序  希尔排序
  这些排序方式全都是属于插入式排序的,
  我们先来看看直接插入排序:
  比较的过程是这个样子的,数组的第二个数据开始往前比较,即一开始用第二个数和他前面的一个比较,如果 符合条件则让他们交换位置。
  假如我们给定一个数组,我们要按照从小到大排序,数组为  [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 分别去比较,然后一直这么重复下去。直到把所有的数据都排列完之后,就得到了我们想要的结果,我们来写个代码看看是什么样子的。  public static void basal(int[] array) {  // 从第二项开始     if (array == null || array.length < 2) {             return;         }         for (int i = 1; i < array.length; i++) {             int cur = array[i];             // cur 落地标识,防止待插入的数最小             boolean flag = false;             // 倒序遍历,不断移位             for (int j = i - 1; j > -1; j--) {                 if (cur < array[j]) {                     array[j + 1] = array[j];                 }else {                     array[j + 1] = cur;                     flag = true;                     break;                 }             }             if (!flag) {              array[0] = cur;             }         }     } }
  既然我们之前都说了,插入排序的方法有很多种,那么我们也得说说其他的插入排序,然后在看看他们都有什么不同的地方,大家说对不对呢?
  既然我们刚才都说了排序每次都要讲数组后移,但是我们之前的判断条件上却是可以优化出来的,这样优化优化的就衍生出来了其他的不同的插入排序,接下来我们就来看看这个二分查找插入排序。  二分查找法插入排序
  优化直接插入排序的核心在于:快速定位当前数字待插入的位置。在一个有序数组中查找一个给定的值,最快的方法无疑是二分查找法,至少在阿粉的心中如果想到优化的时候肯定是第一时间选择的就是可不可以使用二分查找法呢?
  我们先来看看代码实现,然后再看看他有什么缺点,为啥有很多人都不选择使用二分查找插入排序。     // 利用系统自带的二分查找法,定位插入位置       // 不稳定排序      public static void optimized(int[] array) {          if (array == null || array.length < 2) {              return;          }         for (int i = 1; i < array.length; i++) {             int cur = array[i];             int[] sorted = Arrays.copyOf(array, i);             int index = Arrays.binarySearch(sorted,cur);             if (index < 0) {                 index = -(index + 1);            }             for (int j = i - 1; j > index - 1; j--) {                 array[j + 1] = array[j];             }             array[index] = cur;          }     }
  在这其中,阿粉使用了系统自带的Arrays,然后进行了二分查找插入排序,为什么这么用呢?在JDK中提供了 Arrays.binarySearch(),方法的入参需要将有序数组传递进去 来进行实现,为什么不用这种方法呢?
  假如在排序之前,有两个数相等,但是在排序结束之后,它们两个有可能改变顺序这就是说明该排序算法具有不稳定性。这就是大家所说的稳定性。
  既然都有这种不稳定的排序,那是不是就应该存在稳定的排序呢?对没错,就是有,那么什么是稳定的排序呢?对,大家没有想错,冒泡排序就是稳定排序,因为冒泡排序只在相邻元素大小不符合要求时才调换他们的位置,它并不改变相同元素之间的相对顺序, 因此它是稳定的排序算法。
  既然我们刚才说了这个排序中还有希尔排序,我们再来看看希尔排序。  希尔排序
  说实话,阿粉第一次知道这个排序的时候,就想说,是不是一个叫做希尔的人改进的,结果,发现还真是,希尔排序,又叫做((缩小增量排序),因 D.L.Shell 于 1959 年提出而得名,实际上应该叫做Shell"s Sort。
  希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
  实际上就相当于先进行了一个简单的分组,将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次再将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。
  代码实现是这个样子的  public static void sort(int[] a) {     int length = a.length;     int h = 1;     while (h < length / 3) h = 3 * h + 1;     for (; h >= 1; h /= 3) {         for (int i = 0; i < a.length - h; i += h) {             for (int j = i + h; j > 0; j -= h) {                 if (a[j] < a[j - h]) {                     int temp = a[j];                     a[j] = a[j - h];                     a[j - h] = temp;                 }             }         }     } } 选择排序
  选择排序(Selection sort)是一种简单直观的排序算法。
  这个就比较简单了,为什么这么说,是因为他就是直接从未排序的序列中去找最小或者最大的元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
  实际上和冒泡排序在想法上有一丢丢的相似,但是就是不一样。
  我们看看代码是否实现:  public static void sort(int[] a) {     for (int i = 0; i < a.length; i++) {         int min = i;         //选出之后待排序中值最小的位置         for (int j = i + 1; j < a.length; j++) {             if (a[j] < a[min]) {                 min = j;             }         }         //最小值不等于当前值时进行交换         if (min != i) {             int temp = a[i];             a[i] = a[min];             a[min] = temp;         }     } }
  既然阿粉都给大家列出了这几种排序,那么我们又回到一个问题上来了,排序这么多,怎么选择,为什么选择,这就又涉及到了时间复杂度和空间复杂度上面了,要么用空间换时间,要么用时间换空间。  总结
  冒泡排序
  平均时间复杂度  最好情况  最坏情况  空间复杂度  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(nlog2 n) O(nlog2 n) O(nlog2 n) O(1)
  选择排序
  平均时间复杂度  最好情况  最坏情况  空间复杂度  O(n²) O(n²) O(n²) O(1)
  今天的排序就说到这里了,你学会了么?

无线有线双模,17种灯光模式,是游戏外设也是办公利器PXN莱仕达这一品牌专注游戏外设产品,很多喜欢玩游戏的人都知道PXN出品的游戏手柄摇杆方向盘游戏耳机等产品,近期有幸拿到了莱仕达推出的一款K30机械游戏键盘产品,这款产品主要面向手讯飞智能录音笔B1外语方言都能听懂,让声音看得见录音笔是很多职场人士很喜欢的产品,可以帮助记录会议内容,很适合论坛交流会访谈讲座等情景下使用,还有一些职业比如记者讲师律师等更是离不开录音笔。科大讯飞推出了自己的智能录音笔B1,相全屋智能灯76个怎么布局?怎么玩转?全攻略!价值几W设计电路图全文约8000字,自己装修布置的使用干货建议收藏大家好我是一只有趣的INTJ狼,这期来说说智能灯。全屋智能家居现在是比较火热,我家也是全屋的智能家居配置。我全屋的联网设备有100多12个动漫系列推荐,超实用搜索技巧与片源小知识暑假在家看动漫推荐。大家好,我是一只有趣的INTJ狼这期来说一下动画推荐因为刚好EVA终于最终剧场版出完了终于画下一个句号了,这么多年。爷青回了。之前就有提过。就是NAS的那一期,十年投影玩家心得篇十一优派R3,小身材大画面创作声明厂家送测,理性测评大家好我是一只有趣的INTJ狼这次拿到了一台新机,优派的R3写了这么多期投影的,我发现一个问题,很多网友问我,这台机好不好啊?XXX机怎样啊?因为投影的特触控操作,超低延迟,半入耳蓝牙耳机也可以很舒适真无线蓝牙耳机,因为其携带方便续航持久已经成了很多人的必备数码产品,西圣这一南卡旗下的品牌也在持续发力,不断推出更具性价比的耳机产品,今天带来的是西圣ASN(刺客)真无线蓝牙耳机。7月21日新机发布,真我手机誓为打造下半年的黑马最近国产手机线上销量前三名的realme又发布新品了,现在正在预热中。就是对于旗舰来说有很多标准,第一个是真正达到旗舰的配置,但是价格却无上限。第二种是在相应的价格中将配置拉满,这INTJ猫的日常篇十五划船机健身的新选择创作声明划船机怎么选购与深度使用测试。大家好,我是一只可爱的INTJ猫,这期说一下划船机划船机优点是什么?划船机对比跑步机到底好处都有啥?划船机值得买吗?因为之前的跑步机已经服役了内置氮化镓快充技术的插座飞利浦摩天轮智能插座近几年科技发展迅速,各种快充技术让我们身边得智能设备可以更加快速的充电,而插座产品好像一直没什么技术含量,而最近飞利推出了插座行业首款GaN氮化镓新技术地智能插座,支持65W快充的realme新机发布,骁龙778G的性价比极限到底在何处?今天,realme新机发布了。而这次依旧还是非常有质价比。另外在双11的价格方面给的非常给力,性价比再次刷新纪录,真的是非常狠啊。这款手机搭载了高通骁龙778G芯片,因此相对比同级品质可靠公牛插座,让用电时刻安全放心智能时代,我们享受着科技的带来的各种便利,于此同时各种电器智能设备都离不开安全用电,从家庭环境中的各类家用电器,到我们日常生活离不开的手机和各种用电的设备,安全的用电是新时代的主题
挖矿风暴过后,线下电脑城竟成了装机的避风港文雷科技leitech进入2021年,面对着不断上涨的硬件价格,所有的电脑爱好者似乎都有些麻木了。当显卡涨价已成为常态,大容量硬盘加入挖矿行列,内存价格早已涨逾二成,就连CPU都要为什么越来越多年轻人选择激光电视?编辑于斌出品潮起网于见专栏近年来,伴随着新媒体对于激光电视产品越来越关注消费者对于激光电视越来越热衷,于见专栏发现身边正有越来越多的年轻人关注并选择购买激光电视产品。特别是随着20CIM基础平台建设的前世今生和未来来源本文刊登于2021年7月第74期超图通讯CIM的起源CIM是城市发展新方向从上世纪90年代开始,中国的城市管理信息化领域引入了GIS技术作为基础工具,并以此提出了城市网格化管理MIUI最新开发版,性能模式上线丝般流畅,告别卡慢掉帧MIUI作为国内最早的定制系统,无论是界面设计还是功能设置都处于国产系统的领先梯队,但是随着MIUI12不断的负优化,MIUI的整体口碑下滑严重。使用上,MIUI确实没有其它系统那未来的手机会变成什么样?下一个苹果又会是谁?大家有想过未来的手机市场会变成什么样吗?放在十多年前,或许大家不曾想过如今手机AI能够发展到如今的程度,相信也不曾想过屏占比能达到100(即将发布的小米MIX4)。其实这些都是科技骁龙888与麒麟9000的优劣制造工艺上,骁龙888由三星5nm制程代工。CPU采用134的八核心设计,CPU由一颗2。84GHz频率的超大核ARMCortexX1和三颗2。4GHz频率的A78核心以及四颗1。小米MIX4跑分首曝骁龙888Plus实锤8月10日见最近雷总终于不卖关子了,可算是正式官宣了了MIX4机型的发布时间,定在了8月10日。不出意外,该系列机型无疑会成为小米下半年高端市场的顶梁柱。随着小米MIX4的发布时间官宣,网的相小体积大能量AohiMagcube65WGaN快速充电器想必很多朋友日常上班出差旅游的时候都习惯随身带上充电器,特别是喜欢用轻薄笔记本电脑办公的朋友,而大部分笔记本的原装充电器又大又重,携带也不方便,今天给大家介绍一款既可以给手机充电又好评最高的三星Note系列,为啥只有万名粉丝请愿?三星Note系列终结,Note20系列终成绝版,这让无数三星粉丝唏嘘。我们知道,Note系列一直都是三星的重磅旗舰。参照往年的惯例,上半年发布的三星S系列旗舰,主打颜值拍照,引入最骁龙888Plus跑分曝光单核多核性能大涨小米MIX4将于8月10日正式发布。作为下半年小米的旗舰新品,最新的骁龙888Plus芯片也将随之展现性能,毕竟MIX4是这款芯片的首发机型。近日,微博博主数码闲聊站曝光了MIX4谷歌Pixel5a或于8月26日发布,售价450美元左右早前谷歌已经公布了即将推出的Pixel6和Pixel6Pro智能手机,两款手机定于今年秋天推出。这款手机最终可能会成为用户一直以来所要求的高端Android智能手机,谷歌选择使用自