直接插入排序(Straight Insertion Sort)

写排序方法之前还是先介绍一下排序相关的概念:

排序:将任一资源(内存中的数据或文件等等)通过某种方式整理成 按关键字 有序排列的过程 叫排序。

排序的稳定性: 对序列中的两个或两个以上的相等的数据(Ri = Rj , i != j), 排序前 Ri 先于 Rj , 排序后Ri 仍然先于 Rj ,则称该排序是稳定的。否则称为该排序是不稳定的。

比较算法的评判标准: 时间复杂度、控件复杂度、算法的稳定性。

排序的分类:

1、内部排序: 所有数据元素都加载到内存中。

2、外部排序:待排序数据元素太多,无法全部加载到内存中,排序过程中必须在内、外存之间进行数据交换 。


直接插入排序:

直接插入排序的思想是,对于待排序元素集合 Rs={R1,R2 , ... Rn} , 将集合划分为已排好序的Rs1={R1,R2, ... Ri-1} ,和Rs2={Ri ,Ri+1, ... Rn} ,即将进行排序的元素Ri,插入到已经排好序的序列Rs1中,直到所有的元素都插入完为止。显然,R1是有序的。下面给一个序列Rs={37 ,  40 ,  38 ,  42 ,  461 ,  5 ,  7 ,  9 ,  12},

初始序列3740384246157912
第一趟排序结果{3740}       
第二趟排序结果{373840}      
第三趟排序结果{37384042}     
第四趟排序结果{37384042461}    
第五趟排序结果{537384042461}   
第六趟排序结果{5737384042461}  
第七趟排序结果{57937384042461} 
第八趟排序结果{5791237384042461}
没有写的数字直接复制下来就ok 。

以下为该算法的Java实现版:

public static void insertSort(int[] collection) {
        if (null == collection || collection.length == 0)
            return;
        int temp, j;
        for (int i = 1; i < collection.length; i++) {
            temp = collection[i];
            j = i - 1;
            while (j >= 0 && temp < collection[j]) {
                collection[j + 1] = collection[j];
                j--;
            }
            collection[j + 1] = temp;
        }

    }

该方法使用一个额外空间存储当前待插入的元素,空间复杂度为O(N),而每次插入元素都有可能移动一排好序的元素,其时间复杂度为O(n^2).


二分插入排序:
二分插入排序是在查找插入位置时使用二分搜索算法,减少关键字的比较次数,但是却不能减少数据元素移动的次数。关于二分查找方法请参见另一篇文章 二分查找 , 二分插入排序的一个Java实现版本:

public static void binInsertSort(int[] collection) {
        if (null == collection || collection.length == 0)
            return;
        int temp, j, l, h, m;
        for (int i = 1; i < collection.length; i++) {
            l = 0;
            h = i ;
            m = -1;
            temp = collection[i];
            while (l < h) {
                m = (l + h) >> 1;
                if (temp > collection[m]) {
                    l = m +1;
                } else {
                    h = m -1;
                }
            }
            j = i - 1;
            if (m != -1) {
                while (j >= m && temp < collection[j]) {
                    collection[j + 1] = collection[j];
                    j--;
                }
            }

            collection[j+1] = temp;
        }

    }

直接插入排序就写到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值