1.插入排序
最普通的排序算法, 从数组下标1开始每增1项排序一次,越往后遍历次数越多;
原理图:
代码:
2.二分插入排序
插入排序的一种优化实现, 通过二分法减少遍历时间。
原理图:
3.希尔排序
其排序思路有点复杂, 需花多点时间理解;排序思路:先将整个待排序记录序列分割成若干个子序列,在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。
原理图:
代码:
4.冒泡排序
很常见很容易理解的排序算法, 排序思路:遍历数组,每次遍历就将最大(或最小)值推至最前。越往后遍历查询次数越少, 跟插入排序刚好相反。
原理图:
代码:
5.改进冒泡排序
对上述冒泡排序的一种优化, 优化思路:当一次遍历前后数组不产生变化时,说明该数组已经有序,结束排序。
原理图:
代码:
6.快速排序
快速排序在诸多算法排序中可能不是最好的, 但个人认为在JS语言实现中是最快的!以前公司项目中对比过二分插入排序、优化冒泡排序、快速排序的JS实现执行时间,几千条数据的数组在firefox下快速排序的速度比冒泡、插入排序快3至4秒(数组元素为复杂的对象,根据对象某一属性值排序)。阮一峰老师研究JS实现排序时曾只针对该种排序进行讲解:javascript的快速排序实现**。
原理图:
代码:
7.选择排序
实现思路跟冒泡排序差不多, 可以说是冒泡排序的衍生版本;
原理图:
代码:
8.堆排序
因为js模拟二叉树比较麻烦,所以堆排序的优势用js语言无法体现, 相对而言C语言的链表在实现上更能表现堆排序,堆排序或许更适合指针类的计算机语言。本文注重图解各排序的基本思路,所以该排序的具体实现没讲太细, 如想深究实现细节请看:堆排序及其分析**。
原理图:
1.调整二叉树,形成大根堆(子节点都比父节点小)。
2.交换堆第一元素跟最后元素位置,最后元素弹出堆。然后继续回到1,调整堆。
3.重复2, 当所有节点弹出堆后;弹出的节点值就是有序的了。
代码:
9.归并排序
很容易理解且执行效率一般(js实现)的排序, 排序思路:将无序的数组 拆成N部分进行有序处理,然后合并;
原理图:
代码: