ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

漫画:什么是插入排序?

2020-11-12 21:51:56  阅读:259  来源: 互联网

标签:红桃 插入排序 元素 交换 有序 漫画 暂存 什么


漫画:什么是插入排序?

漫画:什么是插入排序?
漫画:什么是插入排序?

————— 第二天 —————
漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?

————————————
漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?

漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?

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

举个例子,比如我手中有红桃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赋值到数组的首位:
漫画:什么是插入排序?

显然,这样的优化方法减少了许多无谓的交换。
漫画:什么是插入排序?
漫画:什么是插入排序?

.

public static void sort(int[] array){
for(int i=1;i<array.length;i++){
int insertValue =array[i];
int j=i-1;
//从右向左比较元素的同时,进行元素复制
for(; j>=0&&insertValue<array[j]; j--){
array[j+1]=array[j];
//insertValue的值插入适当位置
array[j+1]=insertValue;
public static void main(String[] args) {
int aray[]={12,1,3,46,5,0,-3,12,35,16};
sort(array);
System.out.println(Arrays.toString(array));

漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?
漫画:什么是插入排序?

—————END—————

喜欢本文的朋友,欢迎关注公众号 程序员小灰,收看更多精彩内容
漫画:什么是插入排序?

欢迎长按二维码关注 小灰学英语,你所学到的不只是英语!
漫画:什么是插入排序?

给个[在看],是对小灰最大的支持!

标签:红桃,插入排序,元素,交换,有序,漫画,暂存,什么
来源: https://blog.51cto.com/14982143/2549971

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有