漫画:什么是插入排序?

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

——————smiley_92.pngsmiley_92.pngsmiley_92.png——————

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

人们如何进行扑克牌的排序呢?举个例子,比如我手中有红桃6,7,9,10这四张牌,已经处于升序排列:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

给定无序数组如下:

640?wx_fmt=png

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

640?wx_fmt=png

第一轮

让元素8和有序区的元素依次比较。8>5,所以元素8和元素5无需交换。

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

640?wx_fmt=png

第二轮

让元素6和有序区的元素依次比较。6<8,所以把元素6和元素8进行交换:

640?wx_fmt=png

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

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

640?wx_fmt=png

第三轮

让元素3和有序区的元素依次比较。3<8,所以把元素3和元素8进行交换:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=png

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

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

第一步,暂存元素3:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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 array[]={12,1,3,46,5,0,-3,12,35,16};	sort(array);	System.out.println(Arrays.toString(array));	
}

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

如何少走弯路,利用不同区块链的数据结构实现项目上链?

 

数据架构是区块链的重要组成部分,了解数据架构,可以让我们对于自身业务是否适合上链做出明智的判断。

 

9月19日,【dfuse小聚:区块链数据应用讨论会】将在上海举行,dfuse CTO&联合创始人、EOS加拿大联合创始人 Alex Bourget;慢雾科技合伙人兼安全产品负责人启富(Keywolf);MYKET联合创始人/EOS Cannon联合创始人Ricky胖哥,与你一起深度探索区块链应用搭建以及区块链数据结构的奥秘,让你明白到底你的业务该如何上链!

 

长按下方二维码报名

???

640?wx_fmt=jpeg

福利扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg

推荐阅读:

  • HDC.2019后再发力,AppGallery Connect服务新升级
    Docker是啥?容器变革的火花?
  • 算法一看就懂之「 堆栈 」
  • 记一道字节跳动的算法面试题
    火热的云计算,你知道这些吗?
  • 假如从餐饮店的角度来看架构…                                     

真香,朕在看了

创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注