算法排序

先放一段冒泡排序的代码

public class Test {
    public void bubbleSort(int[] a){
        if (a.length<=1){return;}
        for (int i = 0; i < a.length; i++) {
            boolean flag = false;
            for (int j = 0; j < a.length - i - 1; j++) {
                int tmp = a[j];
                if (a[j]>a[j+1]){
                    a[j]=a[j+1];
                    a[j+1] = tmp;
                    flag = true;
                }
            }
            if (flag==false){
                return;
            }
        }
    }

    public static void main(String[] args) {
        int[] q = {10,20,3,2,4,6,7,5};
        Test test = new Test();
        test.bubbleSort(q);
        System.out.println(Arrays.toString(q));
    }
}

for (int i = 0; i < a.length; i++)这个循环体主要是保证数组中的每一个数据都能得到一次修正的机会。for (int j = 0; j < a.length - i - 1; j++)这一个循环体则是每一个元素进行比较做的,j+1和这边的i-a.length-1是相互对应的,因为在比较的时候,比较到n-1个元素的时候就可以停止了,这样也不会有越界的可能性。

这种写法保证的是每一次遍历,在尾部的一定是最大的。还有一种是保证尾部最小的实现。只需要(a[j]>a[j+1])中条件相反就可以做到。

其实冒泡排序的特点就是:不需要额外的空间,只需要一个局部变量来暂存下值就可以。另外一方面的特点就是最优情况下时间复杂度为O(n),最差情况下是O(!n/n)=O(n²),平均下来是O(n²),空间复杂度是O(1)。

另外它是一个稳定的算法,在满足条件的情况下是不会去进行无效换位的。也就是在“同一时间订单,金额大的优先排序”这种类型的需求可以完美的满足它。

冒泡排序在我的思维里面是一个比较基础的算法,特点很明显就是代码很通俗易懂,加上哨兵位来提前退出之后也可以节约无效的计算。

 

 冒泡排序的精髓就是这个动图了。一个元素为基准的确定性,通过双重循环保证后面的无效比较不被发生。

 

posted @ 2020-12-08 14:09  smartcat994  阅读(53)  评论(0编辑  收藏  举报