排序算法之冒泡排序

冒泡排序需要遍历几次数组。在每次遍历中,比较连续相邻的元素。如果某一对元素是降序,则互换他们的值,否则保持不变。一次遍历,至最后一次时,所有元素已经排好顺序

伪算法如下:

1
2
3
4
5
6
7
for (int k = 1; k < list.length; k++) {
            for (int i = 0; i < args.length - k; i++) {
                if (list[i] > list [i + 1]) {
                    swap list[i] with list[i+1];
                }
            }
        }

 恩恩,问题解决了,解决了?好像是,但不是最优雅的方法哦!我们得要力争做一个优雅的程序员

优化思路如下:

复制代码
//是否需要进行下次遍历
boolean needNextPass = true;
for (int k = 1; k < list.length && needNextPass; k++) {
    needNextPass = false;
    for (int i = 0; i < args.length - k; i++) {
        if (list[i] > list [i + 1]) {
        swap list[i] with list[i+1];
        needNextPass = true;
        }
    }
    }
}
复制代码

其实就是:如果某次遍历,元素的位置没有更换的时候,就不需要进行下次,因为元素已经站好队了

举个实例:

复制代码
//Bubble sort instance
public class BubbleSort {
    //Bubble sort method
    public static void bubbleSort(int[] list) {
        boolean needNextPass = true;
        for (int k = 1; k < list.length; k++) {
            needNextPass = false;
            for (int i = 0; i < list.length - k; i++) {
                if (list[i] > list[i+1]) {
                    int temp = list[i];
                    list[i] = list[i+1];
                    list[i+1] = temp;
                    needNextPass = true;
                }
            }
        }
    }
    //Main method
    public static void main(String[] args) {
        int[] list = {2,1,43,6,-3,33,10};
        bubbleSort(list);
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }
    }
}
复制代码

运行结果:

 分析冒泡排序的时间:

最好的情况为遍历一次,确定数组已经排好,不需要进行下次遍历。由于第一次遍历的比较次数为n - 1,所有在最好的情况下,冒泡排序的时间为O(n)。

在最差的情况下,冒泡排序的算法需要进行n-1次遍历(倒序)。第一次遍历比较次数为n-1,第二次遍历需要比较n-2,一次类推,则比较的总次数为:(n-1)+(n-2)+...+2+1 = (n-1)n/2=O(n*n),所以最差情况下为O(n*n),平均时间复杂度为O(n*n)

 

posted @   SamSarah  阅读(214)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
阅读排行:
· AI Agent爆火后,MCP协议为什么如此重要!
· Draw.io:你可能不知道的「白嫖级」图表绘制神器
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· Java使用多线程处理未知任务数方案
点击右上角即可分享
微信分享提示