zoukankan      html  css  js  c++  java
  • 数据结构与算法之排序算法(一):插入排序

    插入排序可以分为:直接插入排序和希尔排序(已知元素,找位置)
    1.直接插入排序

    原理:将一个未排序数组分为无序区和有序区,不断将无序区的第一个元素按照大小插入到有序区,最后直到无序区的元素都插入到有序区,排序完成。

    代码实现:
    for(int i = 1; i < a.length; i++){ //无序区开始下标
        if(a[i] < a[i-1]){//判断是否应排序
            int currentValue = a[i];//将a[i]临时存储起来
            int j = i-1;
            //两个条件的顺序不能变,当j=0时,j--后为-1,如果先判断a[j],则会出现数组越界
            while(j >= 0 && a[j] > currentValue){
                a[j+1] = a[j]; //移位
                j--;
            }
            a[j+1] = currentValue; 
        }
    }

    分析:稳定(无跳跃),空间复杂度O(1),时间复杂度【最佳O(n),平均、最差O(n*n)】 优点:适用于(1)数组基本有序(2)数据量小

     
    2.希尔排序(直接插入排序的改进算法,利用了它的两个优点)

    原理:将数据按照不同的增量(步长)分成多个组,对每个组分别进行直接插入排序。当刚开始元素很无序的时候,增量最大,分的组最多,每个组内进行直接插入排序的元素最少,速度很快;当元素基本有序时(小的在前,大的在后),增量很小,直接插入排序对于基本有序的序列效率很高。

    代码实现:
    for(int gap = a.length / 2; gap >= 1; gap /= 2){//取增量gap为数组长度的一半,依次取当前的一半,最后为1
        //把距离为gap的元素编为一组,扫描所有组
        for(int i = gap; i < a.length; i++){
            int tmp = a[i];//临时存储当前值,为交换后使用
            for(int j = i - gap; j >=0 && tmp < a[j]; j -= gap){//对距离为gap的元素进行排序
                a[j + gap] = a[j];
            }
            a[j] = tmp;
        }
    }

    分析:不稳定(有跳跃,交换的时候后面的可能到前面了),空间复杂度O(1),时间复杂度【取决于增量的选取,在O(nlogn)~O(n*n)之间】

  • 相关阅读:
    bzoj3262 陌上花开
    bzoj2738 矩阵乘法
    bzoj3110 [Zjoi2013]K大数查询
    bzoj2527 [Poi2011]Meteors
    bzoj1758 [Wc2010]重建计划
    启动应用程序的Activty多种方式
    隐藏应用图标的多种方式
    Loading Large Bitmaps Efficiently
    java中的匿名内部类总结
    android listview addHeaderView和addFooterView的注意事项
  • 原文地址:https://www.cnblogs.com/small-boy/p/8036221.html
Copyright © 2011-2022 走看看