六种常用的数列排序算法图解(上)

113 阅读3分钟

本文通过图解,系统性地描述解冒泡排序、选择排序、插入排序、堆排序、归并排序、快速排序六种常用的排序算法

冒泡排序

对数列5,9,3,1,2,8,4,7,6进行冒泡排序

  • 第一轮操作 比较数列最右侧的两个数字76,因为7大于6,两个数字交换位置。 image.png

76互换位置后,往左一步对比,对46做比较,因为4不大于6,不做任何操作。 image.png

接下来继续往左比较84,因为8大于4,两个数字交换位置。 image.png

继续往左比较,...,当第一轮结束后,数列最左位置必为当前数列到最小值。此时数列第一位排序成功。

image.png

  • 第二轮操作

因为数列第一位已经完成排序,第二轮排序可以排除第一位数,改为对数列5,9,3,2,4,8,6,7冒泡排序,重复第一轮相同的操作,从当前数列最右的两位数67进行比较。

image.png

  • ...

因为每一轮操作能确定一位数的排序,当经历数列元素个数n-1次排序后,则8轮操作后,完成对数列5,9,3,1,2,8,4,7,6的冒泡排序。结果如下:

image.png

选择排序

对数列3,5,2,7,9,6,4,8,1进行选择排序

  • 第一轮操作

线性搜索数列并找到最小值1image.png

将最小值替换为列中左端的数字:31位置交换。此时第一轮结束,确定了数列第一位排序。

image.png

  • 第二轮操作 因为数列第一位已经完成排序,第二轮排序可以排除第一位数,改为对数列2,5,7,9,6,4,8,3选择排序,重复第一轮相同的操作,找到数列中最小值2,替换列中左端数字5image.png

  • ...

因为每一轮操作能确定一位数的排序,当经历数列元素个数n-1次排序后,则8轮操作后,完成对数列3,5,2,7,9,6,4,8,1的选择排序。结果如下:

image.png

插入排序

对数列5,3,4,7,2,8,6,9,1进行插入排序

  • 第一轮操作

第一轮操作立刻完成!最左端数字5已完成"操作"。 image.png

  • 第二轮操作 取出尚未操作的数列的左端数字3,将其与已经"操作"的左侧数字进行比较。如果左边数字较大,则交换两个数字,53交换。重复比较,直到出现较少数字或到达最左端(见第三轮操作)。

image.png

  • 第三轮操作 取出尚未操作的数列的左端数字4与已完成操作的数列3,5中的5进行比较,5较大,45交换位置,接下来43进行比较,3较少,不交换并停止比较,此轮操作完成。 image.png

  • ...

插入排序数列需要经历元素个数n次排序,并在最后一轮操作完成后,才能确定数列中每一位数的位置。经历了9轮操作后,数列5,3,4,7,2,8,6,9,1插入排序结果如下: image.png

结语

本文结束,接下来短时间内将会继续完成堆排序、归并排序、快速排序的图解,并对6种排序算法进行空间复杂度与时间复杂度的对比分析,敬请期待。

初次使用pencil画图写文,有不足的地方希望小伙伴多多包涵。

参考内容

《算法动画图解》