Java常用的八种排序算法及代码实现+图解

 更新时间:2022年01月25日 13:28:49   作者:程序员的小傲娇  
这篇文章主要介绍了Java常用的八种排序算法及代码实现,在Java的时候,对于排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。那Java有哪些排序算法呢?本文小编就来详细说说Java经典的8种排序算法,需要的朋友可以参考一下

经典的排序算法有八种,分别为:

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 归并排序
  • 希尔排序
  • 快速排序
  • 堆排序
  • 基数排序

其中冒泡排序、选择排序、插入排序称为三大基本排序。

虽然这三大基本排序算法时间复杂度都是O(n2),但是其实细细讨论之下,还是有各自的特点的。

1.冒泡排序

冒泡排序法的思路

基本思路:

假设我们需要进行升序排列

进行N轮的比较,每一轮将相邻的两个元素依次比较,根据大小进行交换,每轮比较结束后,将最大的元素依次‘冒’到数组的末尾,经过几轮比较后,数组就会呈现有序的状态。

图解:

2)后面每轮都按照此方法进行比较,但是需要注意,此后的每一轮都需要比前一轮少比较一次,因为前面已经确定了最大元素的位置,为了提高性能,可以不用再和后面确定了位置的元素进行比较。

3)由此可以确定,当数组的长度为N时,需要比较的轮数为N-1轮。每轮中从第一个元素开始相邻元素两两进行比较,第一轮需要比较N-1次,第2轮需要比较N-2次,依次类推,实现整体排序。

2.冒泡排序法的代码实现

  • 首先通过一个外层的for循环确定比较的轮数,循环元素数量-1轮。
  • 内部通过一个for循环实现每轮的两两元素比较的效果。每轮需要比较的次数都会比上一轮减少一次,通过j
  • 元素两两比较通过array[j] > array[j+1]来实现。

3.冒泡排序法优化

以上的冒泡排序法还有优化的空间。因为如果一个数组已经是完全有序的情况下,冒泡排序法仍然会进行逐轮的比较,这无疑是浪费性能的行为。因此我们可以确定,当冒泡的比较中,有一轮如果没有发生交换,则可以确定当前数组已经完全有序,后面的轮数完全不必在进行。故做以下的调整:

通过定义一个标识符isSort,如果有一轮没有发生任何交换,则isSort就会为true,下次直接break,后面的轮数就不用再进行比较了。

4.选择排序

选择排序的思路

基本思路:

选择排序和冒泡排序不同,选择排序会通过一轮比较,选出最小的那个元素的下标,然后和第一个元素进行交换,这样第一个元素的位置就可以确定了。

第二轮如法炮制,从第二个元素开始依次比较,选出最小的元素的下标,和第二个元素交换位置,这样第二小的元素位置就确定了。

后面依次类推,直到整个数组呈现有序状态。

选择排序法的代码实现:

  • 选择排序比较的轮数和冒泡排序比较的轮数是一样的
  • K表示当前最小值的下标,当前是第几轮,k就先代表第几个元素的下标,然后依次和后面的元素进行比较,如果发现比k位置元素小的元素时,改变k的下标,这样一轮过后k代表的位置就是本轮最小的元素,和i进行交换即可
  • 如果一轮过后k==i,则说明i本来就是最小的元素,则无需交换提高性能。

5.插入排序

插入排序的思路

基本思路:

假设一个数组已经基本有序,则这个时候插入排序就是一个不错的选择。插入排序是先保证左边元素是基本有序的,然后将后面的元素依次和左边元素进行比较,如果比较到一个比自己小的元素时就可以停止比较了,因为左边已经呈现有序状态,找到比自己小的元素时,就不用再往后比较了。

插入排序的代码实现:

  • 插入排序的轮数和冒泡排序一样,但是i从1开始,因为我们假设第一个元素已经是呈现有序状态了。
  • 内部循环依次从当前位置开始,和前面元素进行比较,如果找到了比自己小的元素,则停止比较,直接退出本轮比较,进行下一轮比较

总结:

  • 虽然三种排序法的时间复杂度都是O(N2),但是不同的场景还是会有不同的性能差异。
  • 冒泡排序法是性能最差的算法,正式运用中,基本不会用冒泡排序法进行排序。
  • 选择排序将交换次数降到最低,但是比较次数仍然很大。当数据量小,并且交换耗时相对于比较耗时更多的情况下,选择排序是个不错的选择。
  • 基本有序的情况下,插入排序是最好的选择,但是如果数据基本逆序的情况下,插入排序的性能和冒泡排序就基本一样了。
  • 从平均情况下来看,插入排序性能会比选择排序略好一些。

以上就是小编整理的Java经典的八种排序算法,希望对学习Java的小伙伴有帮助

到此这篇关于Java常用的八种排序算法及代码实现的文章就介绍到这了,更多相关Java常用排序算法及代码实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路

    Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路

    这篇文章主要介绍了Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java Git Commit Message使用规范

    Java Git Commit Message使用规范

    这篇文章主要介绍了Java Git Commit Message使用规范,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-08-08
  • maven继承父工程统一版本号的实现

    maven继承父工程统一版本号的实现

    这篇文章主要介绍了maven继承父工程统一版本号的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 一文教你如何使用Java灵活读取Excel内容

    一文教你如何使用Java灵活读取Excel内容

    这篇文章主要给大家介绍了关于如何使用Java灵活读取Excel内容的相关资料,读取Excel数据是Java开发中常见的任务,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • TreeSet判断重复元素解析及代码示例

    TreeSet判断重复元素解析及代码示例

    这篇文章主要介绍了TreeSet判断重复元素解析及代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java数组排列组合问题汇总

    java数组排列组合问题汇总

    这篇文章主要为大家详细汇总了java数组排列组合问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Spark SerializedLambda错误的两种解决方案

    Spark SerializedLambda错误的两种解决方案

    这篇文章主要介绍了Spark SerializedLambda错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java线程等待唤醒几种方法小结

    Java线程等待唤醒几种方法小结

    线程等待和唤醒有三种实现方法,分别是Object类中的wait、notify,Condition类中的await、signal,LockSupport类中的park、unpark方法,感兴趣的可以了解一下
    2023-10-10
  • 解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of git executable: no response“的问题

    解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of

    这篇文章主要介绍了解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of git executable: no response“的问题,需要的朋友可以参考下
    2020-08-08
  • Spring boot集成redis lettuce代码实例

    Spring boot集成redis lettuce代码实例

    这篇文章主要介绍了Spring boot集成redis lettuce代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论