Java数据结构和算法之冒泡,选择和插入排序算法

yizhihongxing

Java数据结构和算法之冒泡、选择和插入排序算法

冒泡排序算法

算法思路

冒泡排序是一种基础的排序算法,它通过比较相邻元素的大小并交换位置,将最大(或最小)的元素逐步“冒泡”到序列的最后,从而完成排序。

具体地,冒泡排序的过程如下:

  1. 从序列的第一个元素开始,依次比较相邻的两个元素,如果前面的元素大于后面的元素,则交换它们的位置。
  2. 继续依次比较相邻的元素,直到序列的倒数第二个元素为止。
  3. 重复执行步骤 1、2,直到序列全部排序完成。

示例说明

下面是一组示例数据:

int[] arr = {4, 2, 8, 3, 1};

使用冒泡排序算法对其进行排序,可得到如下过程:

// 第 1 轮
arr[0] 和 arr[1] 比较,arr[0] < arr[1],不交换位置
arr[1] 和 arr[2] 比较,arr[1] > arr[2],交换位置,arr 变成 {4, 8, 2, 3, 1}
arr[2] 和 arr[3] 比较,arr[2] < arr[3],不交换位置
arr[3] 和 arr[4] 比较,arr[3] > arr[4],交换位置,arr 变成 {4, 8, 2, 1, 3}

// 第 2 轮
arr[0] 和 arr[1] 比较,arr[0] < arr[1],不交换位置
arr[1] 和 arr[2] 比较,arr[1] < arr[2],不交换位置
arr[2] 和 arr[3] 比较,arr[2] > arr[3],交换位置,arr 变成 {4, 2, 1, 8, 3}
arr[3] 和 arr[4] 比较,arr[3] < arr[4],不交换位置

// 第 3 轮
arr[0] 和 arr[1] 比较,arr[0] > arr[1],交换位置,arr 变成 {2, 4, 1, 8, 3}
arr[1] 和 arr[2] 比较,arr[1] < arr[2],不交换位置
arr[2] 和 arr[3] 比较,arr[2] > arr[3],交换位置,arr 变成 {2, 1, 4, 8, 3}
arr[3] 和 arr[4] 比较,arr[3] > arr[4],交换位置,arr 变成 {2, 1, 4, 3, 8}

// 第 4 轮
arr[0] 和 arr[1] 比较,arr[0] > arr[1],交换位置,arr 变成 {1, 2, 4, 3, 8}
arr[1] 和 arr[2] 比较,arr[1] < arr[2],不交换位置
arr[2] 和 arr[3] 比较,arr[2] > arr[3],交换位置,arr 变成 {1, 2, 3, 4, 8}

// 第 5 轮
arr[0] 和 arr[1] 比较,arr[0] < arr[1],不交换位置
arr[1] 和 arr[2] 比较,arr[1] < arr[2],不交换位置
arr[2] 和 arr[3] 比较,arr[2] < arr[3],不交换位置
arr[3] 和 arr[4] 比较,arr[3] < arr[4],不交换位置

可见,经过 5 轮排序,序列被正确排序。在最坏情况下,即原序列为逆序排列时,冒泡排序算法的时间复杂度为 O(n^2)。

选择排序算法

算法思路

选择排序算法也是一种基础的排序算法,它通过和冒泡排序不同的思路进行排序。选择排序过程中,依次遍历整个序列,每次找到未排序部分中的最小值(或最大值),并将其放置在已排序部分的末尾。

具体地,选择排序的过程如下:

  1. 设置一个变量 minIndex,初始值和第一个未排序元素的下标相同。
  2. 依次遍历未排序部分的每个元素,将其与 minIndex 指向的元素进行比较,如果找到一个更小(或更大)的元素,则将 minIndex 更新为该元素的下标。
  3. 遍历到序列末尾后,将找到的最小值(或最大值)直接与未排序部分的第一个元素进行交换,从而将其放置在已排序部分的末尾。
  4. 重复执行步骤 2、3,直到整个序列全部排序完成。

示例说明

下面是一组示例数据:

int[] arr = {4, 2, 8, 3, 1};

使用选择排序算法对其进行排序,可得到如下过程:

// 第 1 轮
从 arr[0] 开始遍历,找到 arr[4] 最小,将 arr[0] 和 arr[4] 交换,arr 变成 {1, 2, 8, 3, 4}

// 第 2 轮
从 arr[1] 开始遍历,找到 arr[3] 最小,将 arr[1] 和 arr[3] 交换,arr 变成 {1, 2, 8, 3, 4}

// 第 3 轮
从 arr[2] 开始遍历,找到 arr[3] 最小,将 arr[2] 和 arr[3] 交换,arr 变成 {1, 2, 3, 8, 4}

// 第 4 轮
从 arr[3] 开始遍历,找到 arr[4] 最小,将 arr[3] 和 arr[4] 交换,arr 变成 {1, 2, 3, 4, 8}

// 第 5 轮
遍历完成,整个序列已全部排序完成。

可见,经过 5 轮排序,序列被正确排序。与冒泡排序算法相同,选择排序算法的时间复杂度也为 O(n^2)。

插入排序算法

算法思路

插入排序算法是一种较为高效的排序算法,尤其适用于对有序或基本有序的数据进行排序。插入排序算法的基本思路是将未排序部分中的元素逐个插入到已排序部分中相应的位置。

具体地,插入排序的过程如下:

  1. 将序列分为已排序部分和未排序部分,初始时已排序部分只包含第一个元素,未排序部分包含剩余所有元素。
  2. 遍历未排序部分的每个元素,将其依次插入到已排序部分中相应的位置。具体地,从序列的第二个元素开始,将其与已排序部分的元素依次比较,直到找到第一个比其大(或小)的元素,然后将该元素插入其前面,从而保证已排序部分仍然有序。
  3. 重复执行步骤 2,直到未排序部分全部加入已排序部分为止。

示例说明

下面是一组示例数据:

int[] arr = {4, 2, 8, 3, 1};

使用插入排序算法对其进行排序,可得到如下过程:

// 第 1 轮
已排序部分只包含 arr[0],未排序部分包含 arr[1] 到 arr[4]。取出 arr[1],将其与 arr[0] 比较,发现 arr[1] 较小,将其插入 arr[0] 前面,此时已排序部分为 {2, 4},未排序部分为 {8, 3, 1}。
取出 arr[2],将其依次与已排序部分的元素比较,发现它应该插入到 arr[1] 后面,此时已排序部分为 {2, 4, 8},未排序部分为 {3, 1}。
取出 arr[3],将其依次与已排序部分的元素比较,发现它应该插入到 arr[1] 前面,此时已排序部分为 {2, 3, 4, 8},未排序部分为 {1}。
取出 arr[4],将其依次与已排序部分的元素比较,发现它应该插入到 arr[0] 前面,此时已排序部分为 {1, 2, 3, 4, 8},未排序部分为空。

// 第 2 轮
整个序列已全部排序完成。

可见,经过 2 轮排序,序列被正确排序。相比冒泡排序和选择排序,插入排序的时间复杂度较低,最好情况下为 O(n),平均情况下为 O(n^2)。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构和算法之冒泡,选择和插入排序算法 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Android编程自定义组件实例详解

    Android编程自定义组件实例详解 什么是自定义组件 自定义组件是指在 Android 中自己定义一个组件(View),并通过布局文件或代码使用这个组件,它不同于系统提供的常用组件,例如Button、TextView等。自定义组件可以根据需求自由定义功能和样式,扩展系统组件无法完成的功能。 自定义View的步骤 自定义View的基本步骤如下: 继承系统提供…

    other 2023年6月27日
    00
  • php类中private属性继承问题分析

    PHP中的类中可以定义属性,而属性可以有三种访问权限,分别是public、protected和private。其中private属性的访问权限最小,表示只能在所属的类中被访问,子类无法直接访问。但是,不同的继承关系下,private属性的继承方式也存在差异。 在面向对象的编程中,继承是一个非常重要的概念,而PHP也提供了完整的继承机制,可以通过继承来获得父类…

    other 2023年6月27日
    00
  • Android实现TextView字符串关键字变色的方法

    当在Android中实现TextView字符串关键字变色时,可以使用SpannableString和ForegroundColorSpan来实现。下面是实现的完整攻略: 首先,在XML布局文件中定义一个TextView: <TextView android:id=\"@+id/textView\" android:layout_wi…

    other 2023年8月19日
    00
  • 免费的ip数据库淘宝IP地址库简介和PHP调用实例

    免费的IP数据库淘宝IP地址库简介和PHP调用实例攻略 简介 淘宝IP地址库是一个免费的IP数据库,提供了IP地址与地理位置之间的映射关系。通过使用淘宝IP地址库,您可以根据IP地址获取到对应的地理位置信息,如国家、省份、城市、运营商等。 获取IP地址库 您可以通过以下步骤获取淘宝IP地址库: 访问淘宝IP地址库的官方网站:https://ip.taobao…

    other 2023年7月30日
    00
  • android语音识别方法

    Android语音识别方法 Android语音识别功能是近年来随着智能手机的普及而逐渐流行起来的一项技术。用户可以通过语音命令对应用程序进行操作,从而增强智能手机的交互性和便利性。本文将介绍Android语音识别的原理和实现方法。 语音识别原理 语音识别是指计算机通过识别人类语音和声音将其转化为可处理的数字信号的技术。语音识别技术的核心是声音信号的特征提取和…

    其他 2023年3月29日
    00
  • 详解C语言中双向循环链表的实现

    详解C语言中双向循环链表的实现 什么是双向循环链表? 双向循环链表是一种链表类型,与单向链表不同,它的每个节点不仅包含着向后指针next,还有向前指针prev。这种链表类型通常用于需要快速查找、插入、删除元素等操作的场合,例如在数据结构和算法中经常被用到。 双向循环链表的实现步骤 下面我们来一步步实现双向循环链表的数据结构。 1. 定义节点结构 双向循环链表…

    other 2023年6月26日
    00
  • java方法重写时需要注意的问题

    Java方法的重写是面向对象的重要特性之一,在子类中可以重写父类中的方法,从而实现更加灵活的编程。在Java方法重写时可能会遇到一些问题,需要注意以下几点: 方法重写必须具有相同的方法名称、参数列表和返回类型。 方法名称相同,因为重写的方法需要替代原本的方法。 参数列表相同,因为Java方法调用是基于参数类型和数量进行匹配的。 返回类型也需要相同,因为Jav…

    other 2023年6月27日
    00
  • xshell与securecrt之间不同

    xshell与securecrt之间不同 简介 Xshell和SecureCRT都是常用的远程登录软件,用于连接不同的操作系统和网络设备。它们提供了类似的功能和界面,但是两者之间还存在着一些不同,本文将介绍它们之间的区别。 操作界面 Xshell的操作界面相对简洁,主要分为菜单栏、工具栏、会话窗口和命令行窗口几个部分。SecureCRT的操作界面则比Xshe…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部