【Java】冒泡排序

这篇具有很好参考价值的文章主要介绍了【Java】冒泡排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是冒泡排序

【Java】冒泡排序

定义

冒泡排序(bubble sort)是最基础的排序算法,它是一种基础的交换排序。它的原理就像汽水一样,汽水中常常有许多小气泡飘到上面。而冒泡排序这种排序算法的每一个元素也可以像小气泡一样根据自身大小一点点地向着数组一端移动

那冒泡排序具体是如何移动的呢?

冒泡思想

对于以下这个无序的数列,用冒泡排序的思想进行排序:
【Java】冒泡排序

冒泡排序的思想:相邻元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置;当一个元素小于或等于右侧元素时,位置不变。

【Java】冒泡排序
当通过一轮排序之后,元素9作为最大的元素,移动到了数列的最右端。9是目前有序数列的唯一元素。

总体的排序流程如下:

【Java】冒泡排序

该算法每一轮排序都需要遍历一遍所有的元素,对于8个元素的排序总共遍历了7轮,所以该算法总共需要遍历(元素数量-1)轮,平均时间复杂度为O(n2);

代码实现

import java.util.Arrays;

public class bubbleSort {
    public static void sort(int arr[]) {
        //一共进行元素个数减一轮排序
        for (int i = 0; i < arr.length - 1; i++) {
            //只需要对没有排序的进行排序
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //将前一个比后一个大的两元素进行交换
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
            }
        }
    }

    public static void main(String[] args) {
        int arr[] = {5, 8, 6, 3, 9, 2, 1, 7};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

【Java】冒泡排序

二、冒泡排序的优化

第一次优化

从刚才的排序过程中我们可以发现到第六轮排序结束的时候数列已经是有序的了,但还要进行第七轮排序。对于这种情况,我们可以在数列有序时做出一个标志,那么就不用进行多余的排序了。

public static void sort(int arr[]) {
        //一共进行元素个数减一轮排序
        for (int i = 0; i < arr.length - 1; i++) {
            //有序的标志,每轮的初始值都为true
            boolean isSorted=true;
            //只需要对没有排序的进行排序
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //将前一个比后一个大的两元素进行交换
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                    //如果有元素交换,说明数列还未有序
                    isSorted=false;
                }
            }
            //如果已经有序,则结束排序
            if(isSorted){
                break;
            }
        }
    }

第二次优化

我们还可以进一步对它进行优化,对于如下这个数列:

【Java】冒泡排序
第一轮排序经过两次交换后变为:

【Java】冒泡排序
然后接下来元素4和5进行比较,4小于5,位置不变。
元素5和6进行比较,5小于6,位置不变。
元素6和7进行比较,6小于7,位置不变。
元素7和8进行比较,7小于8,位置不变。

第一轮排序后我们可以发现,数列后面的几个数已经是有序的了,但还要进行几次比较,白白比较了很多次,这正是可以优化的地方。

为了避免这种情况的发生,我们可以在每轮排序后记录下最后一次元素交换的位置,该位置为无序数列的边界,该位置以后为有序区。

public static void sort(int arr[]) {
        //最后一次进行元素交换的位置
        int lastExchangeIndex=0;
        //无序数列的边界,每次排序只需要到这个元素
        int sortBorder=arr.length-1;
        //一共进行元素个数减一轮排序
        for (int i = 0; i < arr.length - 1; i++) {
            //有序的标志,每轮的初始值都为true
            boolean isSorted=true;
            //只需要对没有排序的进行排序
            for (int j = 0; j < sortBorder; j++) {
                //将前一个比后一个大的两元素进行交换
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                    //如果有元素交换,说明数列还未有序
                    isSorted=false;
                    //更新最后一次交换的位置
                    lastExchangeIndex=j;
                }
            }
            sortBorder=lastExchangeIndex;
            //如果已经有序,则结束排序
            if(isSorted){
                break;
            }
        }
    }

三、鸡尾酒排序

冒泡排序都是每一轮从左到右来比较元素,进行单向的位置交换

而鸡尾酒排序每次元素的比较与交换过程是双向

【Java】冒泡排序

对于以上数列,只有元素1的位置不对,但使用冒泡排序却需要进行7轮排序,鸡尾酒排序刚好可以解决这个问题。

第一轮:

第一轮与冒泡排序一样,8和1进行交换

【Java】冒泡排序
第二轮:

第二轮换为从右往左进行比较交换

【Java】冒泡排序
第三轮:

虽然此时已经有序,但流程还未结束,第三轮重新开始从左到右进行比较交换。
几次比较之后没有位置进行交换,排序结束。三轮就已经有序。

鸡尾酒排序第一轮从左到右,第二轮从右到左,第三轮再从左到右…直至数列有序。

public static void sort(int arr[]){
        //鸡尾酒排序每两轮会在数列两端各增加一个有序的的元素,下一轮不用再进行比较
        for (int i = 0; i < arr.length/2; i++) {
            //有序标记,初始值为true
            boolean isSorted=true;
            //奇数轮,从左向右比较交换
            for (int j = i; j < arr.length-i-1; j++) {
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                    //有元素交换,所以不是有序的
                    isSorted=false;
                }
            }
            //如果已经有序,则结束排序
            if(isSorted){
                break;
            }
            //偶数轮前,isSorted重新置为true
            isSorted=true;
            //偶数轮,从右向左进行比较交换
            for (int j = arr.length-i-1; j > i; j--) {
                if(arr[j]<arr[j-1]){
                    int tmp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=tmp;
                    //有元素交换,所以不是有序的
                    isSorted=false;
                }
            }
            if(isSorted){
                break;
            }
        }
    }

鸡尾酒排序的优势是在大多数元素已经有序的情况下减少了排序的回合数,但缺点是代码量增加了近一倍。文章来源地址https://www.toymoban.com/news/detail-495619.html

到了这里,关于【Java】冒泡排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实现:选择排序、冒泡排序、插入排序

    本文我们将使用Java编程语言实现经典的选择排序、冒泡排序和插入排序算法,并用对数器进行测试。 选择排序的基本思想是:遍历数组,每次找到数组中最小的元素,将其放到数组的前端。接着,在剩余的元素中继续寻找最小的元素,将其放在已找到的最小元素之后。重复

    2024年02月02日
    浏览(33)
  • Java 与排序算法(1):冒泡排序

    冒泡排序(Bubble Sort)是一种简单的排序算法,它的基本思想是通过不断交换相邻两个元素的位置,使得较大的元素逐渐往后移动,直到最后一个元素为止。冒泡排序的时间复杂度为 O ( n 2 ) O(n^2) O ( n 2 ) ,空间复杂度为 O ( 1 ) O(1) O ( 1 ) ,是一种稳定的排序算法。 其实现过程

    2024年02月11日
    浏览(43)
  • java冒泡排序

    1.基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值, 若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。 优化: 因为排序的过程中,各元素不断接近自己

    2024年02月16日
    浏览(23)
  • (四)Java算法:冒泡排序

       冒泡排序 (Bubble Sort),是一种计算机科学领域的较简单的排序算法。它的工作原理是:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果不是指定顺序(比如从小达到)就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也

    2024年02月04日
    浏览(87)
  • 冒泡排序(Java)(完整代码)

       推荐我平时练习代码的工具,不用打开eclipse或者idea那么麻烦。 菜鸟工具 冒泡排序无非就是俩个for循环。 内嵌的for是用来求出当前数组最大或最小的那个元素 第一for是用来循环查找次最大的元素直到全部排序好。 先静态化创建数组 先把没排序的数组输出来,用来下次排

    2024年02月11日
    浏览(28)
  • 关于java的冒泡排序

    我们前面的文章中了解到了数组的方法类Arrays,我们本篇文章来了解一下最出名的排序算法之一,冒泡排序!😀 冒泡排序的代码还是非常简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人皆知! 1、比较数组中,两个相邻的元素,如果第一个数比第二个数大,我

    2024年01月22日
    浏览(25)
  • 【Java】冒泡排序

    冒泡排序(bubble sort)是最基础的排序算法,它是一种基础的 交换排序 。它的原理就像汽水一样,汽水中常常有许多小气泡飘到上面。而冒泡排序这种排序算法的 每一个元素也可以像小气泡一样根据自身大小一点点地向着数组一端移动 。 那冒泡排序具体是如何移动的呢? 对于

    2024年02月10日
    浏览(23)
  • Java 语言实现冒泡排序

    冒泡排序是一种简单直观的排序算法,它重复地比较相邻的两个元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。冒泡排序的思路是通过每一轮的比较将最大(或最小)的元素逐渐“冒泡”到数组的最后,并将其固定在正确的位置上。 Java作为一种高级语言,

    2024年02月10日
    浏览(44)
  • 【Java】使用 Java 语言实现一个冒泡排序

    大家好,我是全栈小5,欢迎阅读小5的系列文章。 这是《Java》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平

    2024年03月22日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包