zoukankan      html  css  js  c++  java
  • 插入排序

    直接插入排序

    直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增一的有序表。

    整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。

    JAVA代码实现:

    public static void insertSort(int[] elements){
            for(int i = 1;i <elements.length; i++){
                int j = -1;
                while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化
                if(j < i){
                    //将j之后的数据移动一位,然后把elements[i]移动到j处
                    int temp = elements[i];
                    for(int k = i-1;k >= j;k--){
                        elements[k+1] = elements[k];
                    }
                    elements[j] = temp;
                }
            }
    }

    说明:直接插入排序的时间复杂度为O(n²),该排序方法是稳定的。


    希尔排序(Shell Sort)

    希尔排序又称“缩小增量排序”,它也是一种属插入排序类的方法.

    它的基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

    这里写图片描述

    这里写图片描述

    JAVA代码实现:

    public static void shellSort(int[] elements){
            for(int h = elements.length/2;h > 0;h /= 2){
    
                for(int i = h;i < elements.length; i++){
                    int j = i % h;
                    while(j <= i && elements[i] > elements[j]) j += h;//找到element[i]应该摆放的位置
                    if(j < i){
                        //将j之后的数据移动h位,然后把elements[i]移动到j处
                        int temp = elements[i];
                        for(int k = i-h;k >= j;k -= h){
                            elements[k+h] = elements[k];
                        }
                        elements[j] = temp;
                    }
                }
    
            }
    }

    步骤:
    1.以h(h一般取n/2)为间隔将n个元素列分为几个小组,在每个小组内按直接插入法排序
    2.令h=h/2,重复第1步
    3.当h=1时,排序结束(此时相当于直接插入排序,不过由于数据已经基本排好序,因此比较次数和移动次数比直接插入排序少很多)

    说明:希尔排序的时间性能优于直接插入排序;最后一个增量必须为1;希尔排序是不稳定的。希尔排序的分析是一个复杂的问题,因为他的时间是所取“增量”序列的函数,这涉及一些数学上尚未解决的难题。

  • 相关阅读:
    Nginx访问日志、 Nginx日志切割、静态文件不记录日志和过期时间
    nginx的安装 、Nginx默认虚拟主机、nginx用户认证、nginx 域名重定向
    lnmp架构、mysql的安装、php的安装、nginx相关
    限定某个目录禁止解析php 、限制user_agent 、php的配制文件、PHP的动态扩展模块
    配置url防盗链、目录权限访问控制Directory、文件访问权限控制FilesMatch
    指令的概述
    点击事件交互示例
    日期过滤器示例
    in和not in注意事项
    mysql里的case用法详解
  • 原文地址:https://www.cnblogs.com/mazhitao/p/7487950.html
Copyright © 2011-2022 走看看