本文通过图解,系统性地描述解冒泡排序、选择排序、插入排序、堆排序、归并排序、快速排序六种常用的排序算法
冒泡排序
对数列
5,9,3,1,2,8,4,7,6
进行冒泡排序
- 第一轮操作
比较数列最右侧的两个数字
7
和6
,因为7
大于6
,两个数字交换位置。
7
和6
互换位置后,往左一步对比,对4
和6
做比较,因为4
不大于6
,不做任何操作。
接下来继续往左比较8
和4
,因为8
大于4
,两个数字交换位置。
继续往左比较,...,当第一轮结束后,数列最左位置必为当前数列到最小值。此时数列第一位排序成功。
- 第二轮操作
因为数列第一位已经完成排序,第二轮排序可以排除第一位数,改为对数列5,9,3,2,4,8,6,7
冒泡排序,重复第一轮相同的操作,从当前数列最右的两位数6
和7
进行比较。
- ...
因为每一轮操作能确定一位数的排序,当经历数列元素个数n
-1次排序后,则8轮操作后,完成对数列5,9,3,1,2,8,4,7,6
的冒泡排序。结果如下:
选择排序
对数列
3,5,2,7,9,6,4,8,1
进行选择排序
- 第一轮操作
线性搜索数列并找到最小值1
。
将最小值替换为列中左端的数字:3
和1
位置交换。此时第一轮结束,确定了数列第一位排序。
-
第二轮操作 因为数列第一位已经完成排序,第二轮排序可以排除第一位数,改为对数列
2,5,7,9,6,4,8,3
选择排序,重复第一轮相同的操作,找到数列中最小值2
,替换列中左端数字5
。 -
...
因为每一轮操作能确定一位数的排序,当经历数列元素个数n
-1次排序后,则8轮操作后,完成对数列3,5,2,7,9,6,4,8,1
的选择排序。结果如下:
插入排序
对数列
5,3,4,7,2,8,6,9,1
进行插入排序
- 第一轮操作
第一轮操作立刻完成!最左端数字5
已完成"操作"。
- 第二轮操作
取出尚未操作的数列的左端数字
3
,将其与已经"操作"的左侧数字进行比较。如果左边数字较大,则交换两个数字,5
与3
交换。重复比较,直到出现较少数字或到达最左端(见第三轮操作)。
-
第三轮操作 取出尚未操作的数列的左端数字
4
与已完成操作的数列3,5
中的5
进行比较,5
较大,4
与5
交换位置,接下来4
与3
进行比较,3
较少,不交换并停止比较,此轮操作完成。 -
...
插入排序数列需要经历元素个数n
次排序,并在最后一轮操作完成后,才能确定数列中每一位数的位置。经历了9轮操作后,数列5,3,4,7,2,8,6,9,1
插入排序结果如下:
结语
本文结束,接下来短时间内将会继续完成堆排序、归并排序、快速排序
的图解,并对6
种排序算法进行空间复杂度与时间复杂度的对比分析,敬请期待。
初次使用pencil画图写文,有不足的地方希望小伙伴多多包涵。
参考内容
《算法动画图解》