漫画:什么是插入排序?

简介: 人们如何进行扑克牌的排序呢?举个例子,比如我手中有红桃6,7,9,10这四张牌,已经处于升序排列:这时候,我又抓到了一张红桃8,如何让手中的五张牌重新变成升序呢?用冒泡排序,选择排序,亦或是快速排序?


640.jpg640.jpg


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



640.jpg640.jpg640.jpg640.jpg640.jpg640.jpg



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



640.jpg640.jpg640.jpg640.jpg640.jpg640.jpg

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

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


640.png

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


640.png

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


640.jpg

640.jpg640.jpg640.jpg



给定无序数组如下:

640.png

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


640.png


第一轮



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

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

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


640.png

第二轮



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

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


640.png

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

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


640.png

第三轮



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

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


640.png

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


640.png

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

640.png

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

640.png

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

640.png640.jpg640.jpg640.jpg640.jpg





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

640.png

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

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


第一步,暂存元素3:


640.png


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


640.png

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

640.png


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


640.png

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

640.png

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

640.jpg640.jpg


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.jpg640.jpg640.jpg640.jpg

相关文章
|
8月前
|
搜索推荐 算法 C++
【数据结构与算法篇】手撕排序算法之插入排序与希尔排序
【数据结构与算法篇】手撕排序算法之插入排序与希尔排序
58 0
|
搜索推荐 算法
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
68 0
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
|
搜索推荐 算法
齐姐漫画:排序算法(一)
借用《算法导论》里的例子,就是我们打牌的时候,每新拿一张牌都会把它按顺序插入,这,其实就是插入排序。
125 0
齐姐漫画:排序算法(一)
|
搜索推荐 算法 IDE
齐姐漫画:排序算法(二)之「 归并排序」和「外排序」
那我们借用 cs50 里的例子,比如要把一摞卷子排好序,那用并归排序的思想是怎么做的呢?
142 0
齐姐漫画:排序算法(二)之「 归并排序」和「外排序」
|
搜索推荐 算法 Shell
漫画:什么是希尔排序?
像这样逐步分组进行粗调,再进行直接插入排序的思想,就是希尔排序,根据该算法的发明者,计算机科学家Donald Shell的名字所命名。 上面示例中所使用的分组跨度(4,2,1),被称为希尔排序的增量,增量的选择可以有很多种,我们在示例中所用的逐步折半的增量方法,是Donald Shell在发明希尔排序时提出的一种朴素方法,被称为希尔增量。
114 0
漫画:什么是希尔排序?
漫画:什么是选择排序?
我们假定要获得升序数列,冒泡排序的原理是什么呢? 顾名思义,就是把每一元素和下一个元素进行比较和交换,使得较大的元素像气泡一样向右侧移动:
漫画:什么是选择排序?
|
存储 算法
漫画:什么是归并排序?
举个例子,有A、B、C、D、E、F、G、H一共8个武术家参考参加比武大会。 第一轮,两两一组,有4名选手胜出(四分之一决赛) 第二轮,两两一组,有两名选手胜出(半决赛) 第三轮,仅剩的两人一组,冠军胜出(总决赛)
漫画:什么是归并排序?
|
存储 缓存 搜索推荐
漫画:“排序算法” 大总结
冒泡排序: 漫画:什么是冒泡排序? 选择排序: 漫画:什么是选择排序? 插入排序: 漫画:什么是插入排序? 此外还有冒泡排序的变种,鸡尾酒排序: 漫画:什么是鸡尾酒排序?
138 0
漫画:“排序算法” 大总结
|
搜索推荐
漫画:什么是冒泡排序?
什么是冒泡排序?冒泡排序的英文Bubble Sort,是一种最基础的交换排序。 大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。
229 0
漫画:什么是冒泡排序?