Java初学-冒泡排序

Java初学

第一篇:冒泡排序实现思想和重点

前言

文章讲述了冒泡排序实现代码以及思想和重点

一、冒泡排序通俗理解

冒泡排序类似这样的游戏规则:有一队比赛者,从第一位开始比赛,前面的赢了后面的,后面的输了,你就座他的位置,接着比赛;如果前面的输给了后面,后面的赢了,你就止步于此,让后面赢了你的接着去比赛;直至最厉害的在荣登最后一位冠军;然后在从第一位开始比赛,去争夺亚军,直到全部都有了自己的名次。

二、冒泡排序实现代码

public class Main {
    public static void mp (int[] arr){
        for(int i = 0; i < arr.length-1; i++){
            boolean flg = false;
            for(int j = 0; j < arr.length-1-i; j++){
                if(arr[j] > arr[j+1]){
                    int tmp = arr[j];
                    arr[j+1] = arr[j];
                    arr[j] = tmp;
                    flg = true;
                }
            }
            if(flg = false){
                return;
            }
        }
    }
}

三、冒泡排序思想以及重点总结

  • 思想一:冒泡排序数组排序次数

例如5个数就需要最多比较4次,最少比较1次;因为每次比较完成一趟,已经有一个数是有序的;那剩下4个数比较;

实现关键代码:

for(int i = 0; i < arr.length-1; i++)
  • 思想二:数组排序对比次数
    例如5个数就需要最多比较4次,因为每次比较完成一趟,已经有一个数是有序的;那剩下4个数比较就只要比较3次;(每次比较四次也可以,但因为后面的数已经有序,会显得多余)

重点1:

这里是引用每次都是从第一个开始比较,进行数的交换,因为每次排序完成后,最后那个是已经有序的,我们就只需把前面剩余的数当作一个整体去排序;这就是冒泡排序的精髓,越往上越大

重点2(冒泡排序时间复杂度)

内层循环次数是依次递减的,每次减少一次,假设有n项,第一次n-1,第二次n-2…最后是1,由思想2得知n项数列需要对比n-1次,所以利用等差数列求和,可以知道冒泡排序时间复杂度为:O( n^2 )

实现关键代码

  for(int j = 0; j < arr.length-1-i; j++)
  • 思想三:数的交换

例如5个数要由小到大排序,第一个数从数组第一个数开始,挨个向后比较,如果往后去比较,只要比到比自己小的就交换位置,如果比到比自己大的,就无法进入此次交换,接着第二个循环,j++,由后面的数继续去比较交换

重点3

因为每个数都乱序的,如上由小到大排序,如果下一个数比自己大,他无法进入此次交换,因此这2个数是有序的,但是我们永远不知后面的数有没有比他小的,所以我们要接着拿后面那个大的数去比较,因此数组的排序对比次数是不能像数组排序次数那样提前结束的;那怎样才能使得数组排序次数提前结束呢,请看思想4

重点4

(冒泡排序空间复杂度):冒泡排序的tmp变量,空间仅仅是一个临时变量,并且不会随着排序规模的扩大而进行改变,所以空间复杂度为O(1)

实现关键代码

if(arr[j] > arr[j+1])
  • 思想四:检查有序,提前结束数组排序

例如给定5个数,5个数由小到大排序,从第一次比较,前面比自己大的,然后接着循环到最后一次循环,都是前面比自己大,我们就if(flg = false),结束循环返回;

实现关键代码

 if(arr[j] > [arr[j+1]){ flg = true;}  
 if(flg = false){return;}

上述均为个人编写,如有错误,欢迎批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值