冒泡排序温习

Posted 原地回血

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序温习相关的知识,希望对你有一定的参考价值。

冒泡排序

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)

以上是关于冒泡排序温习的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序

图解排序 1/10 - 冒泡排序

排序算法3种简单排序(选择,冒泡,插入)

C++ 插入排序,冒泡排序和选择排序

图解排序算法之3种简单排序(选择,冒泡,直接插入)

图解排序算法之3种简单排序(选择,冒泡,直接插入)