首页 > 编程语言 > 详细

冒泡排序温习

时间:2021-05-19 10:12:06      阅读:19      评论:0      收藏:0      [点我收藏+]

冒泡排序

1. 在数组中, 相邻的两个元素比大小, 若第一个元素比第二个元素大, 那么就交换他俩的位置

2. 每次比较, 都会产出一个最大值或者最小值

3. 那么在下一次比较时, 就可以少排一次

4. 重复循环, 直至结束

冒泡排序的时间复杂度是: O(n2)

代码

public static void main(String[] args){
    int[] a = {11,12,3,2,34,56,12};
    int sort = sort(a);
    System.out.println(Arrays.toString(sort));
}
public static int sort(int[] array){
    //临时变量
    int temp = 0;
    //创建一个外循环,判断要走多少次
    for(int i=0;i<array.length-1;i++){
        //内循环,用来比大小排序
        for(int j=o;j<array.length-1-i;j++){
            //判断大小
            if(array[j+1]>array[j]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
    return array;
} 

解析:

 for(int j=o;j<array.length-1-i;j++){
            //判断大小
            if(array[j+1]>array[j]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
  • array.length-1: 为了防止下标越界, 若不减1, 当j=6的时候, 下一行代码array[j+1]==array[7], 但数组的长度只有array[6], 所以会报错ArrayIndexOutOfBoundsException 索引越界异常
  • array.length-1-i: -i是因为每次比较的时候都会在最右侧产生一个最大值和最小值, 所以在下次比较的时候倒数第二个数不用和最后一个数进行比较, 故-i

双循环

外层循环的作用:

在未排序的数组中, 将最大数排在数组的最右侧. 在第一次循环时, 将数组中的最大数交换到数组的最右侧; 第二次循环时, 将第二大的数交换到数组的次右侧, 以此类推.

内循环的作用:

冒泡排序每次循环后, 都会把大数排到最右侧, 在第三次排序的时候, 已经将两个最大数放到了最右侧, 所以不需要这两个数进行比较了, 就需要把他俩减掉, i代表着循环次数, 当i=2时,说明已经是第三次循环了, 所以需要length-i(2).

优化:

public static void main(String[] args){
    int[] a = {11,12,3,2,34,56,12};
    int sort = sort(a);
    System.out.println(Arrays.toString(sort));
}
public static int sort(int[] array){
    //临时变量
    int temp = 0;
    //创建一个外循环,判断要走多少次
    for(int i=0;i<array.length-1;i++){
        
        //在此处加一个标记
        boolean flag = false;
        
        //内循环,用来比大小排序
        for(int j=o;j<array.length-1-i;j++){
            //判断大小
            if(array[j+1]>array[j]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                //如果走完循环,就更改flag
                flag = true;
            }
            //判断,如果走完循环flag没有变为true,直接跳出循环
            if(flag==false){
                break;
            }
        }
    }
    return array;
} 

加标记的意思: 如果这个数组本身的顺序就是对的, 那么标识就不会改变(false), 就不用在去外循环, 直接跳出循环返回即可.

两位大佬写的很好, 参考了一下:

CSDN---冒泡排序的双重循环理解

Java中的经典算法之冒泡排序(Bubble Sort)

冒泡排序温习

原文:https://www.cnblogs.com/wiyf/p/14783484.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!