当前位置:首页 > 教育 >

冒泡排序法示意图(冒泡排序法举例)

来源:原点资讯(www.yd166.com)时间:2024-05-15 15:09:40作者:YD166手机阅读>>

如果需要查看排版好看的请搜索微信公众号放开我我还能学

前言

这次我们介绍交换类排序中的冒泡排序,和简单插入排序相似,冒泡排序虽然时间复杂度也是O(n^2),但是对于有序数组的排序,时间复杂度也可以降为O(n),效率是比较高的。

冒泡排序

对数组[1, 4, 3, 2, 5, 6, 7, 8]从小到大排序,使用冒泡排序步骤如下:

  1. 依次比较相邻元素的大小。
  2. 如果前面的数据大于后面的数据,就交换这两个数据,然后向右移动一步,接着比较。经过第一轮的多次比较交换后,最大的数据就移动到了最后。
  3. 以此类推,经过 n 轮循环,数组就排序好了。

下图展示了冒泡排序的过程:

冒泡排序法示意图,冒泡排序法举例(1)

冒泡排序代码:

public static void sort(Comparable[] arr) {    int n = arr.length;    for (int i = n; i > 0; i--) {        for (int j = 1; j < i; j ) {            if (arr[j - 1].compareTo(arr[j]) > 0) {                swap(arr, j - 1, j);           }       }   } } ​ private static void swap(Object[] arr, int i, int j) {    Object t = arr[i];    arr[i] = arr[j];    arr[j] = t; }

优化1

如果对于一个有序的数组,使用上述冒泡排序的话,同样会执行n(n-1)/2次。实际上,在内循环中每一次比较只要没有发生逆序,即元素之间进行交换,那么就说明数组已经有序,这时已经可以退出程序了。

优化思路就是设置一个交换标志swapped,只要发生了交换,就让swapped = true,外部循环判断swapped是否为true,不是就结束程序,说明排序完成。

下面展示了优化思路的过程:

冒泡排序法示意图,冒泡排序法举例(2)

优化代码:

public static void sort(Comparable[] arr) {    int n = arr.length;    boolean swapped = false;    do {        swapped = false;        for (int i = 1; i < n; i ) {            if (arr[i - 1].compareTo(arr[i]) > 0) {                swap(arr, i - 1, i);                swapped = true;           }       }        // 每一次for循环将最大的元素放在了最后的位置        // 所以下一次排序, 最后的元素可以不再考虑,n--        n--;   } while (swapped); } ​ private static void swap(Object[] arr, int i, int j) {    Object t = arr[i];    arr[i] = arr[j];    arr[j] = t; }

优化2

在上述优化的基础上,我们还可以进一步优化。

对于数组:[1, 4, 3, 2, 5, 6, 7, 8],按照上面的优化思路,我们在第一轮比较时,需要让5, 6, 7, 8比较,第二轮比较时,需要让5, 6, 7比较,然而它们都是有序的排列,因此,我们是否能减少这些不必要的比较呢?答案是可以的。

优化思路就是每一轮循环完后,更新n的值,更新为最后一次交换的位置,这样,在此之后的元素都已经是有序的了,那么下次循环中就不用再比较了。

下图展示了优化思路的过程:

冒泡排序法示意图,冒泡排序法举例(3)

优化代码:

public static void sort(Comparable[] arr) { ​    int n = arr.length;    int newn;    do {        newn = 0;        for (int i = 1; i < n; i ) {            if (arr[i - 1].compareTo(arr[i]) > 0) {                swap(arr, i - 1, i);                // 记录最后一次的交换位置,在此之后的元素都是已经有序的,因此下一轮扫描中不再考虑                newn = i;           }       }        n = newn;   } while (newn > 0); } ​ private static void swap(Object[] arr, int i, int j) {    Object t = arr[i];    arr[i] = arr[j];    arr[j] = t; },

栏目热文

冒泡排序法对照表(冒泡排序计算公式)

冒泡排序法对照表(冒泡排序计算公式)

各类排序方法在时间、空间复杂度及稳定性方面各有优势:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两...

2024-05-15 15:08:15查看全文 >>

冒泡排序法的正确方法(冒泡排序详细步骤)

冒泡排序法的正确方法(冒泡排序详细步骤)

01故事起源幼儿园放学,小朋友们集合,需要先从低到高排队,应该怎么排呢?02开始行动小K身高180,是班里最高的,自然得...

2024-05-15 14:35:37查看全文 >>

房屋建筑学这课介绍什么(房屋建筑学课程设计图有哪些)

房屋建筑学这课介绍什么(房屋建筑学课程设计图有哪些)

专业介绍: 工程造价是指对建设某项工程所需的全部费用进行工程预算,例如,盖一栋楼要花多少钱,修一条路需要多少材料,建一条...

2024-05-15 14:28:15查看全文 >>

房屋建筑学入门到精通(房屋建筑学第三版知识点总结)

房屋建筑学入门到精通(房屋建筑学第三版知识点总结)

大家好!欢迎来到【微语职场】!点击「关注」,每天为你分享职业生涯规划、求职面试指导、创业副业建议、自律成长干货。在高中的...

2024-05-15 14:26:13查看全文 >>

房屋建筑学知识应用(房屋建筑学必须掌握的知识)

房屋建筑学知识应用(房屋建筑学必须掌握的知识)

1.构成建筑的基本要素是建筑功能、物质技术条件、建筑形象。建筑功能:房屋的使用要求,它体现建筑物的目的性。物质技术条件:...

2024-05-15 14:48:48查看全文 >>

冒泡排序法的核心操作(冒泡排序法详细讲解)

冒泡排序法的核心操作(冒泡排序法详细讲解)

冒泡法是一种简单的排序方法,它的实现非常简单。首先对n个项目进行扫描,比较相领两个项目的大小,若发现违背大小次序则进行...

2024-05-15 15:04:01查看全文 >>

冒泡排序法的最好情况(冒泡排序顺序详解)

冒泡排序法的最好情况(冒泡排序顺序详解)

要点冒泡排序是一种交换排序。什么是交换排序呢?交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表...

2024-05-15 15:08:44查看全文 >>

冒泡法排序步骤分析(冒泡法从小到大排序怎么操作)

冒泡法排序步骤分析(冒泡法从小到大排序怎么操作)

冒泡排序法的基本思路为:每次将相邻的两个数比较,将小的调在前面。举个例子,如果有6个数:9,8,5,4,2,0。第一次先...

2024-05-15 14:43:31查看全文 >>

冒泡排序法流程图讲解(冒泡排序法详细讲解)

冒泡排序法流程图讲解(冒泡排序法详细讲解)

前言无论是日后面试还是笔试的,排序在数据结构与算法中有着举足轻重的地位,所以还是决定把数据结构这个专题好好写写,多研究研...

2024-05-15 14:50:31查看全文 >>

冒泡排序的基础知识(冒泡排序的详细教学)

冒泡排序的基础知识(冒泡排序的详细教学)

冒泡排序也是一种简单直观的排序算法。其思想是:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交...

2024-05-15 14:58:51查看全文 >>

文档排行