排序可视化
2019-06-20 本文已影响0人
茶还是咖啡
选择排序
![](https://img.haomeiwen.com/i11774306/f1e1742cc379c9bd.gif)
插入排序
![](https://img.haomeiwen.com/i11774306/70ac05deb1c4cef5.gif)
归并排序
![](https://img.haomeiwen.com/i11774306/6c2b48627adb7aec.gif)
快速排序
最基础的快排
每次确定数组的第一个元素作为基准值,然后通过比较和交换,基准值左面的元素都小于基准值,基准值右面的元素都大于基准值(这样基准值所处的位置即为排好序他应该待着的位置),然后,将数组分为三部分,即,基准值左面,基准值,基准值右面,分别进行左右递归,处理剩下的元素。
![](https://img.haomeiwen.com/i11774306/5a1ca9d54ba8b61c.gif)
随机基准值快速排序
上面的排序对于处理无序的数组非常好,但是有很多问题,如果排序数据本身就是趋于有序的,因为每次都是选取当前数组的第一个元素作为基准值,该基准值的位置在没有进行排序之前就处于合适的位置,即,左面的元素小于基准值,右面的元素大于基准值,导致每次进行比较和交换的时候都是遍历整个数组,将时间复杂度拖至O(n)^2.
![](https://img.haomeiwen.com/i11774306/2badeb08fecf4de8.gif)
解决办法
每次通过一个随机数作为基准值的索引下标,然后将该值和数组的第一个元素交换为值即可。
![](https://img.haomeiwen.com/i11774306/66c3a5f4ddfd3fe5.gif)
二路快速排序
如果排序的数据大致相同,快速排序算法又会退化到O(n^2)。
![](https://img.haomeiwen.com/i11774306/96fc99467b90bd33.gif)
解决办法
![](https://img.haomeiwen.com/i11774306/e192b8d22a8d21d2.png)
![](https://img.haomeiwen.com/i11774306/c9f7ba0a47f4bf06.png)
为了避免频繁的交换,在基准值的后面和数组的最后一个位置分别戳一个指针i,j,i指针向后遍历,直到找到大于等于基准值的位置,j指针像前遍历找到小于基准值的位置,然后i,j指针交换各自的元素,i,j继续遍历直到i>j,交换j和基准值的位置。完成一次排序
![](https://img.haomeiwen.com/i11774306/b5af4d2ec0f6cbd1.gif)
三路快速排序
二路快速排序虽然可以解决重复元素的问题,但是仍然还是对重复的元素有相同的处理,为了不再频繁的处理相同的元素,算法再次改进。
三路排序的主要思路是将和基准值的相同的元素归置到一块。下次进行分割数据的时候,不再处理和基准值相同的元素。
![](https://img.haomeiwen.com/i11774306/3e503f65ab598445.png)
![](https://img.haomeiwen.com/i11774306/4b0911e9804fca0a.png)
![](https://img.haomeiwen.com/i11774306/14d6b379616e7abd.gif)
三路快排测试普通用例
![](https://img.haomeiwen.com/i11774306/1ff23d09f43c46f0.gif)
堆排序
![](https://img.haomeiwen.com/i11774306/702385e7254adc3b.gif)
代码详见github