用有趣的漫画理解什么是插入排序

Posted 智能与算法之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用有趣的漫画理解什么是插入排序相关的知识,希望对你有一定的参考价值。

资源干货,第一时间送达

用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序



—————  第二天  —————



用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序



————————————



用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序


人们如何进行扑克牌的排序呢?


举个例子,比如我手中有红桃6,7,9,10这四张牌,已经处于升序排列:


用有趣的漫画理解什么是插入排序


这时候,我又抓到了一张红桃8,如何让手中的五张牌重新变成升序呢?用冒泡排序,选择排序,亦或是快速排序?


用有趣的漫画理解什么是插入排序


恐怕正常人打牌的时候都不会那么做。最自然也最简单的方式,是在已经有序的四张牌中找到红桃8应该插入的位置,也就是7和9之间,把红桃8插入进去:


用有趣的漫画理解什么是插入排序



用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序


给定无序数组如下:


用有趣的漫画理解什么是插入排序


把数组的首元素5作为有序区,此时有序区只有这一个元素:


用有趣的漫画理解什么是插入排序


第一轮

让元素8和有序区的元素依次比较。

8>5,所以元素8和元素5无需交换。


此时有序区的元素增加到两个:


用有趣的漫画理解什么是插入排序


第二轮

素6和有序区的元素依次比较。

6<8,所以把元素6和元素8进行交换:


用有趣的漫画理解什么是插入排序


6>5,所以把元素6和元素5无需交换。


此时有序区的元素增加到三个:


用有趣的漫画理解什么是插入排序


第三轮

素3和有序区的元素依次比较。

3<8,所以把元素3和元素8进行交换:


用有趣的漫画理解什么是插入排序


3<6,所以把元素3和元素6进行交换:


用有趣的漫画理解什么是插入排序


3<5,所以把元3和元素5进行交换:


用有趣的漫画理解什么是插入排序


此时有序区的元素增加到四个:


用有趣的漫画理解什么是插入排序



以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下:


用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序


什么意思呢?让我们以第三轮举例:


用有趣的漫画理解什么是插入排序


在第三轮操作中,我们需要让元素3逐个与有序区的元素进行比较和交换,与8交换、与6交换、与5交换,最终交换到有序区的第一个位置。


但是我们并不需要真的进行完整交换,只需把元素3暂存起来,再把有序区的元素从左向右逐一复制。


第一步,暂存元素3:


用有趣的漫画理解什么是插入排序


第二步,和前一个元素比较,由于3<8,复制元素8到它下一个位置:


用有趣的漫画理解什么是插入排序


第三步,和前一个元素比较,由于3<6,复制元素6到它下一个位置:


用有趣的漫画理解什么是插入排序


第四步,和前一个元素比较,由于3<5,复制元素5到它下一个位置:


用有趣的漫画理解什么是插入排序


第五步,也是最后一步,把暂存的元素3赋值到数组的首位:


用有趣的漫画理解什么是插入排序


显然,这样的优化方法减少了许多无谓的交换。



用有趣的漫画理解什么是插入排序

用有趣的漫画理解什么是插入排序


 
   
   
 
  1. public static void sort(int[] array){

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

  3. int insertValue =array[i];

  4. int j=i-1;

  5. //从右向左比较元素的同时,进行元素复制

  6. for(; j>=0&&insertValue<array[j]; j--){

  7. array[j+1]=array[j];

  8. }

  9. //insertValue的值插入适当位置

  10. array[j+1]=insertValue;

  11. }

  12. }


  13. public static void main(String[] args) {

  14. int array[]={12,1,3,46,5,0,-3,12,35,16};

  15. sort(array);

  16. System.out.println(Arrays.toString(array));

  17. }


用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序


用有趣的漫画理解什么是插入排序


—————END—————


推荐阅读

以上是关于用有趣的漫画理解什么是插入排序的主要内容,如果未能解决你的问题,请参考以下文章

漫画:什么是堆排序?

漫画:插入排序是什么?

漫画:什么是希尔排序?

漫画:什么是冒泡排序?

科活中心有趣的算法——选择排序插入排序

漫画:什么是快速排序?(上)