几种经典的排序算法——冒泡排序

冒泡排序

原理:比较相邻两个数,将较大的数移至右边。
思路:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

如: 排序[3,2,5,4,1]

  1. 两两交换相邻的数字进行交换,大的数字移到右边,故3和2交换位置;[2,3,5,4,1]
  2. 然后重复上述工作,3和5比较,不用交换,故第一轮下来结果为[2,3,4,1,5]
  3. 第二轮结果为[2,3,1,4,5]
  4. 经过N-1轮排序,也就是4轮,完成排序[1,2,3,4,5]
代码如下:

核心代码:

public static void BubbleSort(int[] target) {
        if(target==null||target.length<2){
            return;
        }

        int length = target.length;
        // 这里for循环表示总共需要比较多少轮
        for (int i = 0; i < length; i++) {
            //这里for循环表示每轮比较需要参与元素的数量
            for (int j = 0; j < length - i -1; j++) {
                if (target [j] > target [j+1]) {
                    int temp = target[j+1];
                    target [j+1] = target[j];
                    target [j] = temp;
                }
            }
            //第i轮排序的结果为
            System.out.print("第"+i+"轮排序后的结果为:");
            display(target);
        }
    }

完整测试代码:

public class Main {

    public static void main(String[] args) {
    // write your code here
        int[] target = {3,2,5,4,1};
        System.out.println("未排序数组顺序为:");
        display(target);
        System.out.println("-----------------------");
        BubbleSort(target);
        System.out.println("-----------------------");
        System.out.print("最终的排序结果:");
        display(target);
    }

    public static void BubbleSort(int[] target) {
        if(target==null||target.length<2){
            return;
        }

        int length = target.length;
        // 这里for循环表示总共需要比较多少轮
        for (int i = 0; i < length; i++) {
            //这里for循环表示每轮比较需要参与元素的数量
            for (int j = 0; j < length - i -1; j++) {
                if (target [j] > target [j+1]) {
                    int temp = target[j+1];
                    target [j+1] = target[j];
                    target [j] = temp;
                }
            }
            //第i轮排序的结果为
            System.out.print("第"+i+"轮排序后的结果为:");
            display(target);
        }
    }

    //显示数组
    public static void display(int[] array){
        for(int i = 0 ; i < array.length ; i++){
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}

最终结果:

未排序数组顺序为:
3 2 5 4 1 
-----------------------
第0轮排序后的结果为:2 3 4 1 5 
第1轮排序后的结果为:2 3 1 4 5 
第2轮排序后的结果为:2 1 3 4 5 
第3轮排序后的结果为:1 2 3 4 5 
第4轮排序后的结果为:1 2 3 4 5 
-----------------------
最终的排序结果:1 2 3 4 5 

解释及分析:
解释:本来应该是 5 轮排序的,因为第 4 轮排序之后已经是有序数组了。所以,N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次;
冒泡排序是由两个for循环构成,第一个for循环的变量 i 表示总共需要多少轮比较,第二个for循环的变量 j 表示每轮参与比较的元素下标【0,1,......,length-i】,因为每轮比较都会出现一个最大值放在最右边,所以每轮比较后的元素个数都会少一个,这也是为什么 j 的范围是逐渐减小的。

性能分析:

冒泡排序总的平均时间复杂度为:O(n*n)。

你可能感兴趣的:(几种经典的排序算法——冒泡排序)