广告
返回顶部
首页 > 资讯 > 精选 >Java数据结构常见排序算法有哪些
  • 892
分享到

Java数据结构常见排序算法有哪些

2023-07-05 00:07:18 892人浏览 安东尼
摘要

今天小编给大家分享一下Java数据结构常见排序算法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、 认识排序在学校中

今天小编给大家分享一下Java数据结构常见排序算法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、 认识排序

在学校中,如果我们要参加运动会,或者军训的时候,会按照身高从矮到高进行站队,比如上课老师手上拿的考勤表,通常是按照学号从低到高进行排序的。再比如编程语言排行榜,也是在排序。

Java数据结构常见排序算法有哪些

生活中有相当多的排序场景,由此可知,排序还是很重要的, 本章就会介绍常见的一些排序算法。

所谓排序呢,就拿我们上面的举例来说,会按照某个或某些关键字的大小,递增或者递减排列起来的操作,这就是排序,这里面也涉及到排序的稳定性,举个例子:

比如有这样的一组数据:B  D  A  C  A  F,要按照他们的 ascll 码来排序,这里出现了两个 A,我们把第一个出现的 A 称为 A1,第二个出现的 A 称为 A2。

假定排序后结果为:A1  A2  B  C  D  F,那么这个排序算法就是稳定的。

假设排序后结果为:A2  A1  B  C  D  F,那么这个排序算法就是不稳定的。

简而言之,如果待排序的数据中,有两个相同的元素,排序结束后,这两个元素的关系没有发生改变,比如 A1 排序前在 A2 前面,排完序后,A1 还在 A2 前面,这就是稳定的排序算法。

注意:一个不稳定的排序算法,天生就是不稳定的,但是一个稳定的排序算法,你可以把它设计成不稳定的。

2、常见排序的分类

Java数据结构常见排序算法有哪些

这张图,概括了我们后续要讲的排序算法,接着正式进入本章的学习吧!(排序算法章节,默认都是升序排序) 注:后续所说的复杂度 log,都是以2为底,特殊的会标注出来。

3、直接插入排序

现在想请各位小伙伴,想象一下自己在摸扑克牌,摸了第一张牌放在了自己的手中,接着再摸一张,把这张牌跟手上的一张牌进行比较,把它放到合适的位置, 接着再摸一张,把这张牌跟手上的两张牌进行比较,放到合适的位置。

这就是直接插入排序,简单来说,我们每次取的元素,会往一个有序的序列中插入,也就是每次摸牌之前,手上的牌都是排好序的,我们只需要把新摸到的牌,依次与手上有序的牌进行比较,把它放入合适的位置就行!

这里我们用一副静态的图来简单演示下:

Java数据结构常见排序算法有哪些

大致的思想我们已经明白了,接下来我们就需要用代码来实现他:

public void insertSort(int[] array) {
   // 外循环控制趟数, 第一张牌默认有序, 所以 i 从 1 开始
   for (int i = 1; i < array.length; i++) {
       int tmp = array[i]; //当前摸到的牌
       // 每次从手中牌的最后一张牌开始比较, 一直比到第一张牌
       int j = i - 1;
       for (; j >= 0; j--) {
           //如果当前位置的牌,大于我摸到的牌,就往后挪
           if (array[j] > tmp) {
               array[j + 1] = array[j];
           } else {
               break;
           }
       }
       // 把摸到的牌放到对应位置上
       array[j + 1] = tmp;
   }
}
  • 时间复杂度分析:外循环一共要 n - 1 次,内循环每次最差的情况下要比较 1....n 次,那么去掉 n 前面的小项,也就是 (n - 1) * n 次,即 n^2 - n,去掉最小项,最后的时间复杂度为 O(n^2)

  • 空间复杂度分析:只是开辟了一个 tmp 的变量 i,j,常数,即空间复杂度:O(1)

  • 稳定性:稳定

  • 该排序再数据越接近有序的情况,时间效率越高。

4、希尔排序(缩小增量排序)

这个排序是直接插入排序的一种优化,你可以想象一下,你面前有并排放好的 8 个爱心号码牌,但是它们是无序的,我们要给号码牌分组,按要求,第一次间隔为 4 个号码牌的为一组,分完组后进行直接插入排序,第二次间隔为 2 个号码牌的为一组,进行直接插入排序,第三次间隔为 1 个号码牌为一组,进行直接插入排序。

听到这有点没理解,没关系,我们就通过画图来把我上述说的内容再次理解下:

Java数据结构常见排序算法有哪些

由上图我们可以发现,当间隔 > 1 的时候,都是预排序,也就是让我们的数据更接近有序,但是当间隔为 1 的时候,就是直接插入排序了,前面我们说过,直接插入排序,再数据接近有序的时候时间效率是很快的。由此可见,希尔排序,是直接插入排序的优化版。

如何在代码中实现呢?间隔的值如何取呢?代码中把这个间隔的值称为 gap,这个 gap 的取值方法有很多,有的人提出 gap 为奇数好,有的提出 gap 为偶数好,我们就采取一种比较简单的方法来取 gap 值,首次取数组长度一半的值为 gap,后续 gap /= 2,即可。当 gap 为 1,也就是直接插入排序了。

代码实现如下:

public void shellSort(int[] array) {
   // gap初始值设置成数组长度的一半
   int gap = array.length >> 1;
   // gap 为 1 的时候直接插入排序
   while (gap >= 1) {
       shell(array, gap);
       gap >>= 1; // 更新 gap 值 等价于 -> gap /= 2;
   }
}
private void shell(int[] array, int gap) {
   for (int i = gap; i < array.length; i++) {
       int tmp = array[i];
       int j = i - gap;
       for (; j >= 0; j -= gap) {
           if (array[j] > tmp) {
               array[j + gap] = array[j];
           } else {
               break;
           }
       }
       array[j + gap] = tmp;
   }
}

如果实在是不好理解,就结合上边讲的直接插入排序来理解,相信你能理解到的。

  • 时间复杂度分析:希尔排序的时间复杂度不好分析, 这里我们就大概记一下,约为 O(n^1.3),感兴趣的话,可以查阅一下相关书籍。

  • 空间复杂度分析:仍然开辟的是常数个变量,空间复杂度为 O(1)

  • 稳定性:不稳定

5、选择排序

这个排序是个很简单的排序,你想象一下,有个小屁孩,喜欢玩小球,我给他安排了个任务,把这一排小球从小到大排列起来,摆给我看,于是小屁孩就找,每次从一排小球中找出最大的,放到最后,固定不动,那是不是也就是说,每次能确定一个最大的石子的最终位置了。我们来看图:

Java数据结构常见排序算法有哪些

通过图片我们也能看出来,每次找到最大值于最后一个值交换,所以每趟都能把最大的放到最后固定不动,每趟能排序一个元素出来,那这样用代码来实现就很简单了:

public void selectSort(int[] array) {
   int end = array.length - 1;
   // 剩最后一个元素的时候, 不用比较了, 已经有序了
   // 所以 i < array.length - 1
   for (int i = 0; i < array.length - 1; i++) {
       int max = 0;
       int j = 0;
       while (j <= end) {
           if (array[j] > array[max]) {
               max = j;
           }
           j++;
       }
       //找到了最大值的下标, 把最大值与最后一个值交换
       swap(array, max, end--); // end-- 最后一个元素固定了, 不用参与比较
   }
}

这个算法有没有可以优化的空间呢?

有!那么既然小屁孩能一次找出最大的球,那能不能让小屁孩一次找出两个球出来呢?分别是这些球中,最大的和最小的,最大的放在最右边,最小的放在最左边,那么我们每次就能确定两个球的最终位置,也就是我们一次能排序两个元素。图解:

Java数据结构常见排序算法有哪些

代码实现如下:

public void selectSort(int[] array) {
   int left = 0;
   int right = array.length - 1;
   while (left < right) {
       int maxIndex = left;
       int minIndex = left;
       // i = left + 1 -> 每次找最大最小值下标的时候, 可以不用算默认给的最大值和最小值下标
       for (int i = left + 1; i <= right; i++) {
           if (array[i] > array[maxIndex]) {
               maxIndex = i;
           }
           if (array[i] < array[minIndex]) {
               minIndex = i;
           }
       }
       swap(array, minIndex, left);
       // 如果最大值为 left 的位置情况的话, 走到这, 最大值已经被交换到 min 位置上了
       if (maxIndex == left) {
           // 更新最大值的位置
           maxIndex = minIndex;
       }
       swap(array, maxIndex, right);
       left++;
       right--;
   }
}
  • 时间复杂度分析:虽然是优化了,但去小项之后,还是 O(n^2)

  • 空间复杂度分析:O(1)

  • 稳定性:不稳定

  • 实际开发中用的不多

6、堆排序

如果你有学习过优先级队列,或者看过博主优先级队列的文章,那么这个排序对于你来说还是很轻松的,当然在堆排序的讲解中,不会过多的去介绍堆的概念,如果对这部分概念还不理解,可以移至博主的上一篇文章进行学习。

堆排序,简单来说,就是把一组数据,看成一个完全二叉树,再把这棵树,建大堆或者建小堆,接着进行排序的一种思路。至于如何建大堆或小堆,和向上调整算法以及向下调整算法,这里也不多介绍了,博主的上篇文章都详细介绍过。

这里我们来分析一下,排升序应该建什么堆?大堆!排降序建小堆!

这里我们来排升序,建大堆,因为大堆堆顶元素一定是堆中最大的,所以我们可以把堆顶元素和最后一个元素进行交换,这样我们就确认了最大值的位置,接着将交换后的堆顶元素进行向下调整,仍然使得该数组满足大堆的特性!图解如下:

Java数据结构常见排序算法有哪些

Java数据结构常见排序算法有哪些

如上图步骤也很简单,先是将数组建成大堆,然后利用大堆来进行堆排序,首先将堆顶元素和最后一个元素交换,由此最大的元素就有序了,接着将该堆进行向下调整,使继续满足大堆性质,依次进行下去即可。

代码实现:

public void heapSort(int[] array) {
   // 建大堆 从最后一个非叶子节点开始向下调整
   // 非叶子节点下标 = (孩子节点下标 - 1) / 2
   for (int parent = (array.length - 1 - 1) / 2; parent >= 0; parent--) {
       shiftDown(array, parent, array.length);
   }
   // 建大堆完成后, 每次堆顶元素与最后一个元素交换, 定最大元素的位置
   for (int len = array.length - 1; len > 0; len--) {
       swap(array, 0, len); //根节点与最后一个元素交换
       shiftDown(array, 0, len); //根节点位置向下调整
   }
}
private void shiftDown(int[] array, int parent, int len) {
   int child = parent * 2 + 1;
   while (child < len) {
       if (child + 1 < len && array[child + 1] > array[child]) {
           child++;
       }
       // 判断父节点是否大于较大的孩子节点
       if (array[parent] < array[child]) {
           swap(array, parent, child);
           // 更新下标的位置
           parent = child;
           child = parent * 2 + 1;
       } else {
           return;
       }
   }
}
  • 时间复杂度分析:建堆的时间复杂度优先级队列那期有说过为 O(n),排序调整堆的时候,一共要调整 n-1 次,每次向下调整的时间复杂度是 logn,所以即 logn(n - 1),即 O(n*logn),加上面建堆的时间复杂度:O(n) + O(n*logn),最终时间复杂度也就是:O(n*logn)。

  • 空间复杂度分析:O(1)

  • 稳定性:不稳定

以上就是“Java数据结构常见排序算法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Java数据结构常见排序算法有哪些

本文链接: https://www.lsjlt.com/news/348682.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java数据结构常见排序算法有哪些
    今天小编给大家分享一下Java数据结构常见排序算法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、 认识排序在学校中...
    99+
    2023-07-05
  • Java常见数据结构和算法有哪些
    Java常见的数据结构包括:数组、链表、栈、队列、树、图、堆、哈希表等。常见的算法有:排序算法(如冒泡排序、插入排序、选择排序、快速...
    99+
    2023-09-13
    Java
  • Java数据结构之常见排序算法怎么实现
    这篇文章主要介绍“Java数据结构之常见排序算法怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java数据结构之常见排序算法怎么实现”文章能帮助大家解决问题。注:后续所说的复杂度 log,都...
    99+
    2023-07-04
  • Java深入了解数据结构中常见的排序算法
    目录一,概念1,排序2,稳定性二,排序详解1,插入排序①直接插入排序2,选择排序①直接选择排序②堆排序3,交换排序①冒泡排序②快速排序4,归并排序一,概念 1,排序 排序,就是使一串...
    99+
    2022-11-13
  • 怎么深入了解Java数据结构中常见的排序算法
    本篇文章给大家分享的是有关怎么深入了解Java数据结构中常见的排序算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一,概念1,排序排序,就是使一串记录,按照其中的某个或某些关...
    99+
    2023-06-29
  • 常见的php排序算法有哪些
    常见的PHP排序算法有以下几种:1. 冒泡排序(Bubble Sort):依次比较相邻的两个元素,将较大的元素向后移动,直到最后一个...
    99+
    2023-08-25
    php
  • Java常见基础数据结构有哪些
    这篇文章主要介绍Java常见基础数据结构有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!栈:stack,又称堆栈,他是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行添加、查...
    99+
    2023-06-20
  • Java数据结构常见几大排序梳理
    目录一、排序的概念和分类1.排序的基本概念2.排序的稳定性二、常见排序1.直接插入排序2.希尔排序3.简单选择排序4.堆排序5.冒泡排序6.快速排序6.1.递归快速排序6.2.非递归...
    99+
    2022-11-13
  • 常见的初级排序算法有哪些
    本篇内容主要讲解“常见的初级排序算法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常见的初级排序算法有哪些”吧!前言相信所有的程序员刚开始接触到的算法都会...
    99+
    2022-10-19
  • C语言数据结构与算法排序的方法有哪些
    这篇文章主要介绍“C语言数据结构与算法排序的方法有哪些”,在日常操作中,相信很多人在C语言数据结构与算法排序的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法排序的方法有哪些”的疑...
    99+
    2023-06-22
  • Java数据结构常见几大排序是什么
    这篇文章给大家分享的是有关Java数据结构常见几大排序是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、排序的概念和分类1.排序的基本概念排序是将一批无序的记录(数据)重新排列成按关键字有序的记录序列的过程...
    99+
    2023-06-29
  • 常见Redis数据结构有哪些
    本篇内容主要讲解“常见Redis数据结构有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常见Redis数据结构有哪些”吧!什么是数据结构?有Java基础的应...
    99+
    2022-10-19
  • java数据结构与算法(快速排序法)
    快速排序法: 顾名思议,快速排序法是实践中的一种快速的排序算法,在c++或对java基本类型的排序中特别有用。它的平均运行时间是0(N log N)。该算法之所以特别快,主要是由于非...
    99+
    2022-11-13
  • java 数据结构基本算法希尔排序
    C语言数据结构基本算法希尔排序前言:基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序, 然后再用一个较小的增量(d/2)对它进行分组,在每组中再进...
    99+
    2023-05-31
    数据结构 希尔排序 ava
  • python数据结构的排序算法
    目录十大经典的排序算法 一、交换排序1、冒泡排序(前后比较-交换)2、快速排序(选取一个基准值,小数在左大数在右)二、插入排序1、简单插入排序(逐个插入到前面的有序数中)2、希尔排序(从大范围到小范围进行比...
    99+
    2022-06-02
    python 排序算法 python数据结构
  • java中几种常见的排序算法总结
    目录本节目标;【插入排序】【优化版】【希尔排序】【选择排序】【堆排序】 【冒泡排序】介绍一个冒泡排序的优化方法; 【快速排序】【归并排序】【正文】【代码简介;】&...
    99+
    2022-11-13
  • Java中常见的查找算法与排序算法总结
    目录1. 基本查找2. 二分查找3. 插值查找4. 斐波那契查找5. 分块查找6. 哈希查找7. 树表查找十大排序算法1. 冒泡排序2. 选择排序3. 插入排序4. 快速排序数据结构...
    99+
    2023-03-11
    Java查找算法 Java排序算法 Java查找 排序
  • Java数据结构与算法系列精讲之排序算法
    概述 从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章. 冒泡排序 冒泡排序 (Bubble Sort) 是一种简单的排序算法. 它重复地遍历要排序的...
    99+
    2022-11-13
  • Java中的数据结构与算法有哪些
    这篇文章给大家介绍Java中的数据结构与算法有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。第一部分:Java数据结构要理解Java数据结构,必须能清楚何为数据结构?数据结构:Data_Structure,它是储存...
    99+
    2023-06-08
  • Javascript中有哪些常见的数据结构
    本篇文章为大家展示了Javascript中有哪些常见的数据结构,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.Stack(栈)堆栈遵循LIFO(后进先出)的原则。...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作