zoukankan      html  css  js  c++  java
  • 排序算法总结[2]_冒泡、直接插入和希尔排序

    排序算法总结[2]

    标签(逗号分隔): 排序、算法、Java


    一、冒泡排序

    冒泡排序是最简单的排序算法了,基本思路是:相邻元素两两比较,每次得出一个最大(最小)的冒出即可

    • 时间复杂度:
      平均和最坏是:O(N^2)
      最好是:O(N)---算法需要改进,记录每次要不要交换即可
    • 空间复杂度:O(1)
    • 稳定性:稳定
    • 冒泡排序效率极其低下,在数据量很小的时候拿来玩玩还可以
    void bubbleSort(int[] arr]){
        if(arr==null)throw new NullPointerException();
        if(arr.length<2)return;
        boolean didSwap;
        for(int i=arr.length-1;i>0;--i){
            didSwap=false;
            for(int j=0;j<i;++j){
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arrr[j]=arr[j+1];
                    arr[j+1]=arr[j]; //避免函数调用以提高效率
                    didSwap=true;
                }
            }
            if(didSwap==false)return;//不需要再比较了
        }
    }
    

    二、插入排序

    在数据量不大的时候可以使用插入排序,基本思路是:将数组看做已排序区域和未排序区域,每次从未排序区域取一个数据插入排序区域的正确位置即可。

    • 时间复杂度:
      最坏和平均:O(N^2)
      最好是:O(N),输入是排序的数据,每次只需和前一个元素比较即可
    • 空间复杂度:O(1)
    • 稳定性:稳定
    • 使用:在优化快排的一种策略中,就是选择在数据量较小(n<10)时使用插入排序来完成即可。**
    void insertSort(int[] arr){
        if(arr==null)throw new NullPointerException();
        if(arr.length<=1)return;
        for(int i=1;i<arr.length;i++){
            int j,tmp=arr[i];
            for(j=i;j>0 && arr[j-1]>tmp;--j){
                arr[j]=arr[j-1]; //插入到前面正确的位置上
            }
            arr[j]=tmp;
        }
    }
    

    三、希尔排序

    希尔排序又称为缩小增量排序,基本思路:选定一个由大到小的增量序列,每次以一个增量为基准使用直接插入排序。
    根据选定的增量序列,时间复杂度可能会不同:
    参考:《数据结构与算法分析_C语言描述》 P170 作者:Mark Allen Weiss

    • Hibbard序列的最坏时间复杂度是:O(N^(3/2))
    • Sedgwick提出了其他的序列,最坏可以达到O(N^(4/3))
      下面是一个参考代码:
  • 相关阅读:
    进制转化
    递归小结
    Java异常处理面试题归纳
    字符串相加 内存分配
    递归与循环
    cookie
    会话管理
    在javaweb中通过servlet类和普通类读取资源文件
    JS中遍历EL表达式中后台传过来的Java集合
    Ztree加载完成后显示勾选节点
  • 原文地址:https://www.cnblogs.com/lhyblog/p/5884365.html
Copyright © 2011-2022 走看看