Loading

数据结构 - 冒泡排序

冒泡排序

1、算法描述

给定一个数组,用第一个元素与第二个元素比较,如果大于第二元素,则交换,接下来,比较第二个和第三个,依次到最后一个元素。如果有给定的数组元素有n个,那么需要重复n-1次上面的过程。为何为冒泡算法,因为每一轮的比较,都是由相邻两个元素比较交换,把大元素依次的交换到最后一个元素,如同气泡冒出水面

2、算法简单实现

3、代码实现
/**
 * @author xuwanglu
 * @Description: 冒泡排序
 * @date 2019/1/20 5:05 PM
 * <p>
 * 冒泡排序:给定一个数组,使用数组第一个元素和第二个元素比较,大则交换,小则不变,在第二个和第三比较,依次把最大的冒泡到最后一个元素。这样就把最大元素冒泡到最后了。
 * 后面则依次把第一个到倒数二个元素冒出第二大元素,依次排序完。时间复杂度为O(n2)
 */
public class BubbleSort {

    public static void bubbleSort(int[] array) {

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    SwapUtils.swap(j, j + 1, array);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] array = {2, 4, 6, 0, 11, 3, 5, 6, 3};
        BubbleSort.bubbleSort(array);
        PrintUtils.print(array);
    }

}

4、优化

当如果给定[1,2,3,4,5,6]数组时,则在原来的冒泡排序下,还是需要n-1轮比较,其实这已有序,不需要比较了,那么这种情况我么可以在内循环加一个标记,记录一轮比较下来是否有发生元素交换,如果没有则说明有序,无需继续下面的比较。

/**
     * 优化后冒泡排序
     * 如果一趟下来都没有交换的化,那么说明已经有序了,所以可以加一个标记,查看是否一趟下来有交换,没有的化则不需要比较了
     *
     * @param array
     */
    public static void bubbleSortWithOptimized(int[] array) {

        for (int i = 0; i < array.length; i++) {
            int flag = 0;
            for (int j = 0; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    flag++;
                    SwapUtils.swap(j, j + 1, array);
                }
            }
            if (flag == 0) {
                break;
            }
        }
    }
posted @ 2019-01-20 21:46  xwlmdd  阅读(216)  评论(0编辑  收藏  举报