Java数据结构与算法(4) 冒泡排序

news/2025/2/26 7:25:31

###前言

最近编程状态很自由,我挺喜欢这种感觉。不过还是要给自己制定一个计划,每天学习一小节《Java数据结构与算法》和看一小节刘宇波老师的《数据结构与算法》视频,还有就是学习Spring Boot项目课程。然后每天晚上的时候,写一篇简书总结自己一天回顾的知识。


###从简单的冒泡排序开始 冒泡排序算法运行起来十分慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在开始研究排序技术时是一个非常好的算法。


###什么是冒泡排序? 对几个无序的数字进行排序,最常用的方法是所谓的冒泡排序。算法思想是每次比较2个相邻的数字,将小的放在前面,将较大的放在后面,这样就可以将这些数中最大的找出来放在到最后。然后再比较剩下的数字,再在这些数字中找出最大的,直到所有的数字按照从小到大的顺序进行排序。

###提炼思想

  • 在算法执行的时候,最大的数据项总是冒泡到数据的顶端。

  • 假如有N个数字需要进行排序,在对所有的数字进行了第一趟排序之后,进行了N - 1次比较,并且按照数字之间的初始位置,进行了最少0次,最多N - 1次交换,数组最末端的数据项就此排定。

  • 我们进行第二趟排序的时候,再一次地从左到右,两两比较,并且在适当的时候交换数字之间的顺序,这一次只需要比较到右边第二个数字(位置 N - 2)就行了,因为最大的数字已经到了最后位置,既N - 1号位置。

###开始练手

  • 只有把思路理清楚了,才能开始写代码。
public class BubbleSortDemo {
    public static int[] a = { 2, 4, 6, 8, 3, 6, 9, 12 };

    public static void main(String[] args) {
        sort();
        display();
    }

    public static void sort() {
        int count = a.length;

        for (int i = 0; i < count - 1; i++) {
            for (int k = 0; k < count - 1 - i; k++) {
                if (a[k] > a[k + 1]) {
                    swap(k, k + 1);
                }
            }
        }
    }

    public static void swap(int x, int y) {
        int temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }

    public static void display() {
        int count = a.length;

        for (int i = 0; i < count; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println("");
    }
}
复制代码
  • 运行程序,看控制台输出结果。


###性能优化 我们使用的是一个独立的swap()方法来执行交换操作的。它只是交换数组中的两个数据项的值,使用一个临时变量来存储第一个数据项的值,然后把第二项的值赋给第一项,之后再让第二项的值等于临时变量。实际上,使用一个独立的swap()方法不一定好,因为方法调用会增加一些额外的开销,如果写自己使用的排序程序,最好将交换操作这段代码直接放到程序中,这样可以提高一些速度。


###冒泡排序的效率

  • 我们发现在第一趟排序时进行了9次比较,第二趟排序时进行了8次比较,以此类推,直到最后一趟进行了一次比较。那么10个数据项,一共就进行了9 + 8 + ... + 1 = 45次,也就是N * (N - 1)/ 2。如果初始数据项时逆序的时候,我们每次比较都需要交换。可以知道冒泡排序运行需要O(N^2)时间级别,这样速度是很慢的。

  • 只要看到了一个循环嵌套在另一个循环中,就可以怀疑这个算法的运行时间为O(N^2)级。


###尾言

勿以善小而不为。


http://www.niftyadmin.cn/n/4585927.html

相关文章

Vitalik对“信任模型”的思考

Vitalik对“信任模型”的思考 许多区块链应用程序最有价值的属性之一是去信任&#xff1a;应用程序能够以预期的方式继续操作&#xff0c;而不需要依赖特定的参与者以特定的方式进行操作。 即使他们的利益可能会改变&#xff0c;并推动他们在未来以一些不同的意想不到的方式行…

JAVA DES加密和解密工具类

2019独角兽企业重金招聘Python工程师标准>>> package com.afreon.util;import java.io.IOException; import java.security.SecureRandom;import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.…

Web3 网络效应:五种心智模型

Web3 网络效应&#xff1a;五种心智模型 在过去的十年里&#xff0c;网络效应推动了Web2平台的崛起&#xff0c;也奠定了其主导地位&#xff0c;同时激发了建设者和投资者的想象力。一些人认为网络效应在Web3中会更加强大&#xff0c;而另一些人则认为Web3会扼杀网络效应。 在…

注意padding-top 百分比定义基于父元素宽度的百分比上内边距!!是基于宽度

定义和用法 padding-top 属性设置元素的上内边距&#xff08;空间&#xff09;。 说明 该属性设置元素上内边距的宽度。行内非替换元素上设置的上内边距不会影响行高计算&#xff0c;因此&#xff0c;如果一个元素既有内边距又有背景&#xff0c;从视觉上看可能延伸到其他行&am…

卡牌NFT游戏的角逐:Shiryo能否脱颖而出?

卡牌NFT游戏的角逐&#xff1a;Shiryo能否脱颖而出&#xff1f; Shiryo想要创造一款NFT交易卡牌游戏&#xff0c;让玩家能够享受其中&#xff0c;而不是去玩游戏来赚钱。 现在我们已经看到&#xff0c;区块链领域中许多“玩赚”游戏的失败之处&#xff0c;就是他们试图创造一种…

Hue编辑器命令执行

每一代人都有自己的命中注定的遗憾。遗憾&#xff0c;深深的遗憾。 唯一能自慰的是&#xff0c;我们曾真诚而充满激情地在这个世界上生活过&#xff0c;竭尽全力地劳动过&#xff0c; 并不计代价地将自己的血汗献给了不死的人类之树。 漏洞描述 Hue编辑器存在命令执行漏洞&am…

NFT创作者需要的9个基本工具

NFT创作者需要的9个基本工具 从CRM系统到电子商务平台和移动应用程序&#xff0c;各行各业的企业都前所未有地依赖于数字技术。NFT的世界也是如此——为了保持客户的参与度和粘性&#xff0c;我们需要利用大量的数字平台。 现在有一系列工具&#xff0c;使创建和铸造NFT变得轻…

exit和abort都是用来终止程序的函数

exit会做一些释放工作&#xff1a;释放所有的静态的全局的对象&#xff0c;缓存&#xff0c;关掉所有的I/O通道&#xff0c;然后终止程序。如果有函数通过atexit来注册&#xff0c;还会调用注册的函数。不过&#xff0c;如果atexit函数扔出异常的话&#xff0c;就会直接调用ter…