java排序算法(2)—插入排序

1、概述

排序就是将一组对象按照某种逻辑顺序重新排列的过程。

  • 插入排序基本思想:

(1)每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序;

(2)第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;

(3)依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

2、代码实现

package com.chunsoft.sort;
/**
 * @author chunsoft
 */
public class InsertSort {
    public static void main(String[] args) {
        int data[] = {9,8,7,6,5,4,3,2,1}; 
        F_InsertSort(data);
        for(int num :data) {
            System.out.println(num);
        }  
    }
    //排序方法
    public static void F_InsertSort(int[] data) {
        int n = data.length; //输入数据长度
        int insertNode; //要插入的元素

        //边界验证
        if(data == null ||  n <= 0) {
            return;
        }
        //第一个元素默认有序,从第二个元素开始插入
        for(int i = 1;i < n;i++) {
            insertNode = data[i];
            //已排序的元素个数
            int j = i - 1;
            while(j >= 0 && insertNode < data[j]) {
                //如果插入元素小于第j个元素,就将第j个元素往后移动
                data[j+1] = data[j];
                j --;
            }
            //直到要插入的元素不小于第j个元素,将insertNode插入到已排序序列中
            data[j+1] = insertNode;
        }   
    }
}

3、复杂度和稳定性

(1)复杂度

和选择排序不同的是,插入排序所需要的时间取决于输入元素的初始顺序。例如,对一个很大且其中元素已经有序的数组进行排序将会比随机顺序的数组或逆序的数组排序快得多。

对于随机排列长度为N且主键不重复的数组,平均需要N*N/4次比较和N*N/4次交换。最坏情况下需要N*N/2次比较(1+2+…+(N-1))和N*N/2次交换,最好情况下需要N-1次比较和0次交换。

时间复杂度:O(N*N)
空间复杂度:O(1)

(2)稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

稳定的:
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的

(3)特点

插入排序对以下几种倒置元素数量较少时,可能比任何算法都快:

  • 数组中每个元素距离它的最终位置都不远;
  • 一个有序的大数组接一个小数组;
  • 数组中只有几个元素的位置不确定。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值