【JAVA】什么是冒泡排序?——面试加分题

冒泡排序是一种计算机科学领域的较简单的排序算法,有心人将代码不断优化改良,本人特摘抄部分代码进行学习。

文章来自开源中国,转载自:程序员小灰。原文:漫画:什么是冒泡排序?

冒泡排序第一版

public class BubbleSort {

private static void sort(int array[])

{

    int tmp  = 0;



for(int i = 0; i < array.length; i++){

        for(int j = 0; j < array.length - i - 1; j++)

        {

            if(array[j] > array[j+1])

            {

                tmp = array[j];

                array[j] = array[j+1];

                array[j+1] = tmp;

            }

        }

    }

}

public static void main(String[] args){

    int[] array = new int[]{5,8,6,3,9,2,1,7};

    sort(array);

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

}

}

使用双循环来进行排序。外部循环控制所有的回合,内部循环代表每一轮的冒泡处理,先进行元素比较,再进行元素交换。

问题:倒数第三轮时,已经有顺序,不必再排序!

冒泡排序第二版

public class BubbleSort {
private static void sort(int array[])
{
    int tmp  = 0;
    for(int i = 0; i < array.length; i++)
    {
        //有序标记,每一轮的初始是true
        boolean isSorted = true;
        for(int j = 0; j < array.length - i - 1; j++)
        {
            if(array[j] > array[j+1])
            {
                tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
                //有元素交换,所以不是有序,标记变为false
                isSorted = false;
            }
       }
        if(isSorted){
            break;
        }
    }
}
public static void main(String[] args){
    int[] array = new int[]{5,8,6,3,9,2,1,7};
    sort(array);
    System.out.println(Arrays.toString(array));
}
}

这一版代码做了小小的改动,利用布尔变量isSorted作为标记。如果在本轮排序中,元素有交换,则说明数列无序;如果没有元素交换,说明数列已然有序,直接跳出大循环。

问题:如果后半部分元素已经有序,每一轮还要白白比较。

冒泡排序第三版

在每一轮排序的最后,记录下最后一次元素交换的位置,那个位置也就是无序数列的边界,再往后就是有序区。

这一版代码中,sortBorder就是无序数列的边界。每一轮排序过程中,sortBorder之后的元素就完全不需要比较了,肯定是有序的。

public class BubbleSort {
private static void sort(int array[])
{
    int tmp  = 0;
    //记录最后一次交换的位置
    int lastExchangeIndex = 0;
    //无序数列的边界,每次比较只需要比到这里为止
    int sortBorder = array.length - 1;
    for(int i = 0; i < array.length; i++)
    {
        //有序标记,每一轮的初始是true
        boolean isSorted = true;
        for(int j = 0; j < sortBorder; j++)
        {
            if(array[j] > array[j+1])
            {
                tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
                //有元素交换,所以不是有序,标记变为false
                isSorted = false;
                //把无序数列的边界更新为最后一次交换元素的位置
                lastExchangeIndex = j;
            }
        }
        sortBorder = lastExchangeIndex;
        if(isSorted){
            break;
        }
    }
}

public static void main(String[] args){
    int[] array = new int[]{3,4,2,1,5,6,7,8};
    sort(array);
    System.out.println(Arrays.toString(array));
}
}

猜你喜欢

转载自blog.csdn.net/sinat_35630008/article/details/82722240