冒泡排序的实现与优化

冒泡排序基本原理

从第一个数开始前后两个数相互比较,将两数中的较大的(较小的)向后移动,即像冒泡一样上浮。

**

时间复杂度

**
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 和记录移动次数 均达到最小值: 这里写图片描述这里写图片描述
所以,冒泡排序最好的时间复杂度为 这里写图片描述
  若初始文件是反序的,需要进行 趟排序。每趟排序要进行 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:这里写图片描述

这里写图片描述
冒泡排序的最坏时间复杂度为 这里写图片描述
综上,因此冒泡排序总的平均时间复杂度为 这里写图片描述


N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。

简单冒泡排序:

    public void bubbleSort() {
        int temp;
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays.length - i - 1; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arrays));
    }

运行结果:
这里写图片描述


优化后冒泡排序:如果排序已完成无数据交换结束循环

public void bubbleSort_1() {
        int temp;
        for (int i = 0; i < arrays.length; i++) {
            boolean f=true;
            for (int j = 0; j < arrays.length - i - 1; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                    f=false;
                }       
            }
            if(f)break;
        }
        System.out.println(Arrays.toString(arrays));
    }

运行截图:
这里写图片描述


单for冒泡排序实现:

public void bubbleSort_2() {
        int temp;
        int count=arrays.length-1;
        for (int i = 0; i < count; i++) {       
                if (arrays[i] > arrays[i + 1]) {
                    temp = arrays[i];
                    arrays[i] = arrays[i + 1];
                    arrays[i+ 1] = temp;
            }
            if(i==count-1) {
                i=-1;
                count-=1;
            }
        }
        System.out.println(Arrays.toString(arrays));
    }

猜你喜欢

转载自blog.csdn.net/qq_37239695/article/details/81289641