栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

手撸冒泡排序代码:数据结构与算法小结1

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

手撸冒泡排序代码:数据结构与算法小结1

首先,正在看文章的靓仔,现在有个需求给你:

将已知的数组里面的值重新排序,按照从小到大的顺序打印输出;

你会怎么思考呢?

这个需求需要用到排序的算法,排序有很多种方式,比如

1.冒泡排序:(今天以这个为例)

2.选择排序:

3.插入排序

一   . 为啥叫冒泡排序呢?

一开始我也挺有疑问的,直到我将排序过程竖着看的时候,就豁然开朗了;

举个例子,一个数组长这样:

Integer[] arr = {85, 7, 9, 56, 47, 1, 2, 8, 5};

假如竖着看,就变成这样:

有没有觉得特别像一条鱼吐泡泡:

所以现在要做的就是将数组中的 数值大的元素“浮”到上面,就像吐泡泡,上面的泡泡更大(数值更大);

二 .手写冒泡排序代码:

不知道你理解了没,反正我是理解了,接下来上手写一个冒泡排序代码(使用java语言);

自定义冒泡排序工具类需要的方法有:

1.sort:遍历, 调用greater和exchange方法完成排序;

2.greater:比较两个相邻元素的大小;

3.exchange :交换两个元素的位置;

三 .撸代码tips(基础知识):(强烈建议自己思考写一下代码)

  1. 方法建议写static修饰,因为可以直接类名.调用,无需创建对象;

  2. 因为会涉及到排序,所以会涉及到Comparable接口的使用,在写测试类的时候就需要注意,新生成的数组用包装类型的,因为这里会涉及到一个基本数据类型和包装类型的区别:

    2.1  int基本类型没有实现Comparable接口,而包装类Integer实现了Comparable接口;

  3. 循环条件的边界值的设定很关键,边界值定不好容易产生indexOutOfBoundsException的问题;至于具体定多少,可以看极限情况是什么条件:比如刚好第一个元素就是最大的数字,需要进行(arr.length-1)次调换,调换到最后一个位置;

四 .上代码:

package compare.bubble;


public class MyBubble {
    //排序
    public static void sort(Comparable[] a) {
        //有length-1个元素需要进行交换的过程
        //写法1
        for (int i = a.length - 1; i > 0; i--) {
            //要从索引0处的元素开始交换,最坏情况一直交换到length-1次;
            for (int j = 0; j < i; j++) {
                //比较假如a[j]比a[j+1]大,则交换位置
                if (greater(a[j], a[j + 1])) {
                    exchange(a, j, j + 1);
                }
            }
        }
        

    }

    //比较大小
    public static boolean greater(Comparable c1, Comparable c2) {
        
        return c1.compareTo(c2) > 0;
    }

    //交换位置
    public static void exchange(Comparable[] a, int b, int c) {
        //建立一个临时元素,用于交换中转
        //第一个函数等号后面的元素就是下一个函数的等号前面的元素,首尾衔接,即完成交换
        Comparable num = a[b];
        a[b] = a[c];
        a[c] = num;
    }
}

写个测试类测试一下成果:

package compare.bubble;3

import java.util.Arrays;


public class MyBubbleTest {
    public static void main(String[] args) {
        Integer[] arr = {85, 7, 9, 56, 47, 1, 2, 8, 5};
        MyBubble.sort(arr);
        System.out.println(" 我是鱼:"+ Arrays.toString(arr));
    }
}

运行输出结果:

留个问题供大家思考:

五:冒泡排序的时间复杂度是多少呢?

算法基本功之一:弄清时间复杂度_StefanSSSS的博客-CSDN博客首先时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并且确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作 T(n) = 0(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度,其中f(n)是问题规模n的某个函数;说人话:衡量一个算法复杂程度的式子,相同环境条件下,肯定越简单速度越快;那我们追求的就是把时间复杂度高的优化...https://blog.csdn.net/StefanSSSS/article/details/120817896?spm=1001.2014.3001.5501

还没完,玩个游戏赢了得到答案!!!

游戏规则:找不同

皮一下很开心~

六:补充

1.冒泡排序:

2.选择排序:

3.插入排序

以上三种排序的算法时间复杂度都是O(n^2),随着数据量的增加,对性能的要求会越来越高,所以不是大数据量级别的推荐选择;有兴趣可以带着疑问再去自学一下,强烈建议亲手撸一下代码;

下次推文预告,手写个单向链表撸一撸~

如果上班不忙的话~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/345134.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号