zoukankan      html  css  js  c++  java
  • 排序之插入排序:直接插入+希尔排序

    一、插入排序

    1、思想:原理类似抓扑克牌,在有序表中进行插入和查找,插入合适的位置时,之后的元素需要往后移动

    2、时间复杂度:

    最好:O(N),正序情况,只有比较时间,无移动时间

    最坏:O(N2),逆序情况

    平均:O(N2)

    3、辅助空间:O(1)

    4、稳定性:稳定

    5、适用场合:适用于初始序列基本有序的情况,或者n小的时候,插入排序效率高

     1     public static void insertSort(int[] a) {
     2         int target,i,j;
     3         for(j = 1;j < a.length; j++) {//当前待插入的元素下标
     4             target = a[j];//待插入元素
     5             while(j>0 && target < a[j-1]) {
     6                 a[j] = a[j-1];//向后移动
     7                 j--;
     8             }
     9             a[j] = target;
    10         }
    11     }
    12         

    二、希尔排序

    1、思想:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个记录基本有序时,再对整个记录进行一趟插入排序,步长最后必减少为1

    2、时间复杂度:

    最好:O(N1.3)

    最坏:O(N2)

    平均:根据步长不同

    3、辅助空间:O(1)

    4、稳定性:不稳定,插入排序本身稳定,但是由于有步长,所以不稳定

    5、适用场合:关键字较小的记录就不是一步一步地向前挪动,而是跳跃式地往前移,从而使得进行最后一趟排序时,整个序列已经做到基本有序,只要作记录的少量比较和移动即可。因此希尔排序的效率要比直接插入排序高。

    public static void shellSort(int[] a) {
            int i,j,r,temp;
            for(r = a.length/2;r >= 1;r = r/2) { //r为步长
                for(i = r;i < a.length;i++) {
                    temp = a[i];
                    j = i - r;
                    while(j >= 0 && temp < a[j]) {
                        a[j+r] = a[j];
                        j-= r;
                    }
                    a[j+r] = temp;
                }
            }
        }
  • 相关阅读:
    偶串_牛客网
    制造回文_牛客网
    字典树(前缀树)的实现
    动态规划LeetCode174地下城游戏
    动态规划LeetCode64最小路径和
    动态规划LeetCode300最长上升子序列
    动态规划LeetCode120三角形最小路径和
    Zabbix 监控sqlserver
    如何回收VCSA 6自带的vPostgres数据库空间
    领益科技:导出Wireless组中的成员
  • 原文地址:https://www.cnblogs.com/lizijiangmm/p/8645423.html
Copyright © 2011-2022 走看看