zoukankan      html  css  js  c++  java
  • 算法排序

    先放一段冒泡排序的代码

    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)。

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

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

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

  • 相关阅读:
    vue截取video视频中的某一帧
    sm加密前端解析--JS实现国密算法SM2加密
    前端js解析识别图片二维码
    如果让你来设计一个分页功能, 你会怎么设计? 前后端如何交互?
    jQuery事件
    如何实现文件上传?说说你的思路
    实现JWT鉴权机制
    对中间件概念的理解,如何封装 node 中间件
    Node 文件查找的优先级以及 Require 方法的文件查找策略
    angularjs input使用ng-model双向绑定无效bug解决
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/14102339.html
Copyright © 2011-2022 走看看