冒泡排序

冒泡排序

冒泡排序的基本思想是:通过对待排序序列从前向后(从较小下标开始),依次比较相邻元素的值,如发现逆序则交换2个元素的位置,使得较大的元素逐渐从前移向后面,就像水底的气泡一样逐渐向上冒。

冒泡排序_第1张图片

从图解中我们可以看出,第一趟通过比较相邻2个元素的大小,找出最大的元素,第二趟找出第二大的元素,依次类推,逐渐从小到大排序。

  • 代码演示:
public class BubbleSort {

    public static void main(String[] args) {
        int[] array = {35,88,16,27,32,4,90,56,79};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

    public static void sort(int[] array) {
        // 冒泡排序一共有 数组的长度 - 1 趟
        boolean flag = false;
        for (int i = 1; i < array.length; i++) {
            // 每一趟比较的次数都逐次递减
            for (int j = 0; j < array.length - i; j++) {
                if (array[j] > array[j+1]) {
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                    // 如果一躺下来有交换过位置就,就把flag编程true
                    flag = true;
                }
            }

            // 冒泡优化,如果一躺下来没有交换位置,说明已经排好序了,不需要在继续比较了;
            if (!flag) {
                break;
            }
            flag = false;
        }

    }
}

运行结果:

[4, 16, 27, 32, 35, 56, 79, 88, 90]
  • 下来我们来看看冒泡排序的效率
    我们加大排序的数量及来计算排序所需要的时间
public static void main(String[] args) {
//        int[] array = {35,88,16,27,32,4,90,56,79};
        int[] array = new int[80000];
        for (int i = 0; i < array.length; i++) {
            // 随机生成一个0到8000000的随机数
            Random random = new Random();
            int nextInt = random.nextInt(8000000);
            array[i] = nextInt;
        }
        // 排序前时间,h毫秒
        long beforeSortTimeMillis = System.currentTimeMillis();
        sort(array);
        // 排序后时间
        long afterSortTimeMillis = System.currentTimeMillis();
        System.out.println("排序总共花费时间为:" + (afterSortTimeMillis - beforeSortTimeMillis) + "毫秒");

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

看看运行的时间:

排序总共花费时间为:11246毫秒

从这里我们可以知道
用冒泡排序一个80000数量级大概花费了11秒,时间还是比较长的。
冒泡排序_第2张图片
从图中可以看出冒泡排序的时间复杂度是O(n^2),随着n的增大,冒泡排序时间以平方阶来增大,所以冒泡排序不适合大数据量的排序,我们可以选择速度更优的排序算法了。

你可能感兴趣的:(数据结构与算法)