美文网首页
几种经典的排序算法——冒泡排序

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

作者: f155b8f6e0ac | 来源:发表于2020-03-05 10:41 被阅读0次

    冒泡排序

    原理:比较相邻两个数,将较大的数移至右边。
    思路:
    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)。

    相关文章

      网友评论

          本文标题:几种经典的排序算法——冒泡排序

          本文链接:https://www.haomeiwen.com/subject/svltrhtx.html