算法排序的思想

Posted smartcat994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法排序的思想相关的知识,希望对你有一定的参考价值。

先放一段冒泡排序的代码

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(n2),平均下来是O(n2),空间复杂度是O(1)。

技术图片

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

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

技术图片

 

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

技术图片

 

以上是关于算法排序的思想的主要内容,如果未能解决你的问题,请参考以下文章

十大经典排序算法

交换排序(冒泡排序快速排序的算法思想及代码实现)

排序之归并排序的算法思想及实现代码

选择排序(简单选择排序堆排序的算法思想及代码实现)

基于比较的七种常见排序算法

基于比较的七种常见排序算法