最简洁明了易懂,数据结构:插入排序之直接插入排序

直接插入排序:

直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

 仅使用了常数个辅助单元,因而空间复杂度为O(1)

时间复杂度:O(n)

49 38 65 97 76 13 27 79

直接插入排序就是依次排序 :

第一次排序 38与49 比较交换 变成 38 49 65 97 76 13 27 79

第二次是65与前面的38 49 比较 不交换38 49 65 97 76 13 27 79

第二次是97与前面的38 49 比较 不交换38 49 65 97 76 13 27 79

。。。

public class InsertSort {

    public static void main(String[] arg) {
        int[] a=new int[] {49,38,65,97,76,13,27};
        int n=a.length;
        InsertSort(a,n);
    }

    static void InsertSort(int a[],int n) {
        int i,j,temp;
        int h=1;
        // 第1个数只有一个数无法比较  肯定是有序的,所以从第二个数才开始遍历去比较
        for(i=1;i<n;i++) {
            // 取出第i个数,和前i-1个数比较后,插入合适位置
            if(a[i]<a[i-1]) {
                //取一个中间变量存值
                temp=a[i];
                for(j=i-1;j>=0&&a[j]>temp;--j) {
                    // 因为前i-1个数都是从小到大的有序序列,所以只要当前比较的数(list[j])比 
                    //temp大,就把这个数后移一位
                    //例如:i=2,就是第二次排序,如果a[1]>temp=a[2] 则进入循环交换 
                    //a[2]=a[1],--j 后 如果a[0]>temp 则进入循环交换 a[1]=a[0]
                    a[j+1]=a[j];
                }
                //因为--j,所以得加回来
                // 例如:取i=1的时候  49 和 38 比较,循环下来就是 如果a[1]<a[0]  temp=a[1]                                                 
                //a[1]=a[0] a[1]=temp
                a[j+1]=temp;
            }

            //遍历打印每一次插入排序的结果
            for(int c=0;c<n;c++) {
                System.out.print(a[c]+" ");
            }

            //第几次排序
            System.out.println("第"+ h++ +"次排序");

        }
    }
}



运行结果:
38 49 65 97 76 13 27 第1次排序
38 49 65 97 76 13 27 第2次排序
38 49 65 97 76 13 27 第3次排序
38 49 65 76 97 13 27 第4次排序
13 38 49 65 76 97 27 第5次排序
13 27 38 49 65 76 97 第6次排序
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值