插入排序代码实现与详解

插入排序代码实现与详解

1.基本思想

插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

2.明确

首先要明确,当有n个元素时,则需要n-1次插入,为什么是n-1呢 因为初始有序表只有一个元素时,这个元素不需要进行比较插入。之后的n-1个元素才需要在有序表中进行比较插入。

3.代码实现(代码以升序为例,采用java实现)
private static void insertSort(int[] nums){
    int n =nums.length;
    int indexval=0; //当前要插入节点值
    int preindex=0; //当前要插入节点的前一个节点
    for (int i = 1; i < n; i++) {
        indexval=nums[i];
        preindex=i-1;
        while(preindex>=0 && nums[preindex]>indexval){
            nums[preindex+1]=nums[preindex];
            preindex--;
        }
        nums[preindex+1]=indexval;
        System.out.println("第"+i+"次插入");
        System.out.println(Arrays.toString(nums));
    }
}

输入:{130,35,109,1}

输出:

第1次插入
[35, 130, 109, 1]
第2次插入
[35, 109, 130, 1]
第3次插入
[1, 35, 109, 130]
最终结果:[1, 35, 109, 130]

4.代码详解

上述代码实现从小到大排序,那么基本思想中描述的有序表和无需表分别在nums数组的左侧和右侧,而indexval记录的就是当前无序表的第一个元素,这个元素要通过while循环与前面的有序表中元素进行比较,找到合适的位置就插入。

while条件中preindex>=0 && nums[preindex]>indexval,preindex>=0保证前一个元素的下标没有越界,如果因为这个条件不满足跳出循环,说明当前元素是目前有序表中最小的,它就被放在了第一个位置。nums[preindex]>indexval就是控制从小到大的排序的条件,一直到找到比indexval小的元素就找到了插入位置。

while循环中nums[preindex+1]=nums[preindex]; 这句也很关键,把比indexval大的元素向后移动一位,这样保证了之后插入indexval的时候不会覆盖别的元素。

5.总结:

思路就是不断取出无需表的第一个元素,在有序表中从后向前比较,找到插入位置插入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值