冒泡算法java实现

2020-05-12  本文已影响0人  牙齿不帅
import java.util.Arrays;

public class Bubbling {
    public static void main(String args[]) {

        int array[] = {6, 5, 4, 3, 2, 1, 0};
        sort(array);
        sort2(array);

    }

    /**
     * O((n-1)+(n-2)+(n-3)...1)=O((n-1)*n/2)=O(1/2*n^2-1/2*n)=O(n^2)
     * 1,2,3,4,5,6=(7+7+7)=(n+1)*n/2=1/2n^2+1/2n=21
     * 这是一种冒泡法的实现,不过这种排序是循环的与每一个元素进行比较,无论数据如何分布都会进行比较,用的是内外层循环比较。
     *
     * @param array
     */
    public static void sort(int array[]) {
        int n = 0;
        if (array == null || array.length < 2) {
            return;
        }
        for (int i = 0; i < array.length - 1; i++) {
            int a = array[i];
            n++;
            //循环从下一个元素开始,与之后的每一个元素比较,如果其比我小,我就与其交换
            for (int j = i + 1; j < array.length; j++) {
                int b = array[j];
                if (a > b) {
                    array[i] = b;
                    array[j] = a;
                    a = b;
                }
                n++;
            }
            System.out.println(Arrays.toString(array));

        }
        System.out.println(n);
        System.out.println(Arrays.toString(array));
    }

    /**
     * 与上一个排序不同,所有的元素比较都是在内层做的,每一个都与下一个比较,大于则交换位置,所以末尾的是最大的一个。
     * 这样的好处是:能够判断出元素没有进行过比较交换的操作,顺序就是递增的,不需要进行比较了,从而避免了无效的比较操作。
     * 时间复杂度:
     * 1.最坏情况:与上一种一样。
     * 2.最好情况:O(n-1)=O(n)
     *
     * @param array
     */
    public static void sort2(int array[]) {
        int n = 0;
        if (array == null || array.length < 2) {
            return;
        }
        boolean swap = false;
        for (int i = 0; i < array.length - 1; i++) {//只需要比较n-1次,因为最后一个不需要比较,所以范围-1
            n++;
            //循环从下一个元素开始,与之后的每一个元素比较,如果其比我小,我就与其交换
            for (int j = 0; j < array.length - i - 1; j++) {
                int a = array[j];
                //j+1的位置,所以j判断的范围需要缩小1个
                int b = array[j + 1];
                //内层循环的每一个都与下一个比较
                if (a > b) {
                    array[j + 1] = a;
                    array[j] = b;
                    swap = true;
                }
                n++;
            }
            System.out.println(Arrays.toString(array));
            //如果数据已经是按照从小到大的顺序了,那么就不用再比较了
            if (!swap) {
                break;
            }

        }
        System.out.println(n);
        System.out.println(Arrays.toString(array));
    }

}
上一篇下一篇

猜你喜欢

热点阅读