排序算法--直接插入排序

排序算法中的直接插入排序是将数据插入到合适位置完成排序;
  1. 思路

    1. 先是将前面两个比较做交换,有必有时交换位置,组成一个有序区;
    2. 再将3个数和之前有序区对比,将第三个数插入到合适位置;
    3. 重复以上操作, 以致数据完成最后排序;
  2. Demo 完整源码地址

/**
 * @Title: 排序基本算法
 * @Package ${package_name}
 * @Description: 排序基本算法
 * Created by eason_hoo on 16/8/7.
 */
public abstract class BaseSorter {

    //构造sort函数
    public  abstract  void  sort(int[] array);

}


/**
 * @Title:  直接插入排序
 * @Description:  直接插入排序 有N条数据需要N-1中间排序 思路简单效果较好
 *                如果数据是无规则,需要移位的数据非常多,效果下降
 * Created by eason_hoo on 16/8/7.
 */
public class DirectInsertionSorter extends BaseSorter {

    @Override
    public void sort(int[] array) {

        int temp;

        for (int i = 1; i < array.length; i++){

            temp = array[i]; //记录最外层当前的循环的i值

            if(array[i] < array[i - 1]){ //当array[i] < array[i-1]值需要做交换

                int j = i - 1;

                //当array[i] < array[i-1]需要和有序区挨个比较移位
                while (j >= 0 && temp < array[j]){

                    //当前值小于有序数据最大值,有序数据向后移一位
                    array[j + 1] = array[j];
                    //有序数组挨个比较
                    j--;
                }
                //如果是array[0]不用移位
                array[j + 1] = temp;
            }
        }
    }
}
  1. 算法分析

    时间复杂度:

    最好的情况: 有序、比较次数N-1 次、 移动0 次

    最坏的情况: 逆序、每次从无序区取出第一个元素,首先需要与有序区最后一个元素比较一次,然后继续从有序区的最后一个元素比
    较,直到比较到有序区第一个元素,然后插入到有序区首位置。

然后再将tmp与有序区元素比较,这个比较过程一共移动的次数为:有序区数组大小,最后还要将拷贝tmp移动插入到有序区的位置上。
在这个过程中:
有序区数组大小为1时,比较2次,移动3次;
有序区数组大小为2时,比较3次,移动4次;
……
有序区数组大小为n-1时,比较n次,移动n+1次。
可见:
比较的次数为:2+3+……+n = (n+2)(n-1)/2
移动的此时为:3+4+……+n+1 = (n+4)(n-1)/2

so 直接插入排序的时间复杂度为O(n2)

空间复杂度:

在整个排序过程中都是使用一个temp so直接插入排序空间复杂度为 O(1)

排序稳定性:

直接插入排序是稳定排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值