常见排序算法总结——1、冒泡排序

常见排序方法

原创文章,转载请添加本网页链接

https://blog.csdn.net/qq_37334950/article/details/104375022

1、冒泡排序:比较相邻的元素,前一个大于后一个,则交换他们

举例:
   初始状态:3 6 4 2 11 10 5
  第一次排序:3 4 2 6 10 5 11(比较六次,11沉到未排序序列尾部)
  第二次排序:3 2 4 6 5 10 11(比较五次,10沉到未排序序列尾部)
  第三次排序:2 3 4 5 6 10 11(比较四次,6沉到未排序序列尾部,按照例子的数组来说,此时已经排序结束,为了视觉直观,下面也列出来)
  第四次排序:2 3 4 5 6 10 11(比较三次,5沉到未排序序列尾部)
  第五次排序:2 3 4 5 6 10 11(比较二次,4沉到未排序序列尾部)
  第六次排序:2 3 4 5 6 10 11(比较一次,3沉到未排序序列尾部)

分析:
  进行了(n-1)次排序,第一次排序(n-1)次,最后一次排序1次,每次比较(n-1)至1
  次,平均每次[(n-1)+1]/2 = n/2次,总计[n(n-1)]/2次。

代码逻辑:
  首先写一个(n-1)的for循环A代表(n-1)次排序,然后在A循环内部再写一个以
  (n-1)到1为上限的for循环B代表比较的次数,最后在B循环内部做判断是否交换
  元素

代码示例(代码工具-AS):

    public static void main(String args[]){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(6);
        list.add(4);
        list.add(2);
        list.add(11);
        list.add(10);
        list.add(5);

        log(list);//打印数组
        /**
         * 冒泡排序
         */
        int i = list.size();//拿到数组的大小
        for (int j = i; j > 1 ; j--){//(n-1)的for循环代表(n-1)次排序
            System.out.println("第"+ (list.size() - j + 1) +"次排序");
            for (int k = 1;k < j;k++){//(n-1)到1为上限的for循环代表比较的次数
                System.out.println("   第"+ (k) +"次比较");
                int l = list.get(k-1);
                if (l > list.get(k)){//做判断是否交换元素
                    list.set(k-1,list.get(k));
                    list.set(k,l);
                }
            }
            log(list);//打印数组
        }
        log(list);//打印数组
    }
	 /**
     * 打印数组
     * @param list 要打印的数组
     */
    private static void log(ArrayList<Integer> list){
        String s = "";
        for (int m = 0; m < list.size(); m++) {
            if (m == 0){
                s = list.get(0)+"";
            } else {
                s = s + "," + (list.get(m)+"");
            }
        }
        System.out.println("--打印数组:" + s);
    }

结果一览:
在这里插入图片描述
排序成功,但是如结果显示,第三次排序的结果已经是最终排序结果,那么第四次开始到第六次都是无用功,那么要修改一下排序代码,添加判断条件isChanged:当本次排序没有元素互换位置,则直接break跳出排序的for循环

代码示例:

    public static void main(String args[]){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(6);
        list.add(4);
        list.add(2);
        list.add(11);
        list.add(10);
        list.add(5);

        log(list);//打印数组
        /**
         * 冒泡排序
         */
        boolean isChanged = true;//初始值需要为true,为了第一次判断通过
        int i = list.size();//拿到数组的大小
        for (int j = i; j > 1 ; j-- ){//(n-1)的for循环代表(n-1)次排序
            if (isChanged){
                isChanged = false;
                System.out.println("第"+ (list.size() - j + 1) +"次排序");
                for (int k = 1;k < j;k++){//(n-1)到1为上限的for循环代表比较的次数
                    System.out.print("   第"+ (k) +"次比较");
                    int l = list.get(k-1);
                    if (l > list.get(k)){//做判断是否交换元素
                        list.set(k-1,list.get(k));
                        list.set(k,l);
                        isChanged = true;
                    }
                }
                log(list);//打印数组
            } else {
                System.out.println("第"+ (list.size() - j + 1) +"次排序,不需要再排序了,跳出循环");
                break;
            }
        }
        log(list);//打印数组
    }

在这里插入图片描述
结果分析:上面说了第三次排序已经是最终结果了,这里为什么还会有第四次排序呢,其实是因为第四次排序的比较结束后,我们才发现当前数组没有元素互换,数组已经是最终结果,所以第四次排序虽然是排序,但是本质相当于是一次检验,检验出当前的数组已经是最终结果,那么下一次排序将打破for循环

发布了2 篇原创文章 · 获赞 1 · 访问量 166

猜你喜欢

转载自blog.csdn.net/qq_37334950/article/details/104375022