参考:《数据结构与算法 JavaScript 描述》
visualgo 数据可视化
JavaScript 排序算法
排序算法的核心思想是对一组数据按照一定的顺序重新排列。重新排序时用到一组嵌套的 for
循环,其中外循环会遍历数组的每一项,内循环则用于比较元素。
冒泡排序
之所以叫冒泡排序,是因为排序时,数据会像起跑一样从数组的一端漂浮到另一端。算法在数组中移动,比较相邻的数据,当左侧大于右侧数据时将他们进行交换。
1 | /** |
选择排序
选择排序从数组的开头开始,将第一个元素和其他每一个元素进行比较,检查所有元素后,最小的元素会被放到数组的第一个位置,然后算法会从第二个位置继续。这个过程一直进行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序。
1 | /** |
插入排序
插入排序有两个循环,外循环将数组元素挨个移动,而内循环则对外循环中选中的元素及后面的那个元素进行比较。如果外循环中选中的元素比内循环中的元素小,那么数组元素会向右移动,为内循环中的这个元素腾出位置。
1 | function insertSort(arr) { |
希尔排序
希尔排序的工作原理是,通过定义一个间隔序列来小时排序过程中进行比较的元素之间有多远的间隔。我们可以动态定义间隔序列,不过对于大部分实际应用常见,算法要用到间隔序列可以提前定义好。
1 | function shellSort(arr) { |
外循环控制间隔序列的移动,也就是说,算法在第一次处理数据集时,会检查所有间隔为 4 的元素,下一次检查间隔为 1 的元素。在开始最后一次处理是时,大部分元素都将在正确的位置,算法就不必对很多元素进行交换,这也是希尔排序高效的地方。
快速排序
快速排序是处理大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据一次分解为包含较小元素和较大元素的不同子序列。该算法不断重复这个步骤直到所有数据都是序列的。
首先要在列表中选择一个元素作为基准值 (pivot
)。数据排序围绕基准值进行,将列表中小于基准值的元素移到数组的底部,将大于基准值的元素移到数组的顶部。
快速排序的算法和伪代码:
- 选择一个基准元素,将列表分隔成两个子序列
- 对列表重新排序,将所有小于基准值的元素放在基准值前面,所有大于基准值的元素放在基准值后面
- 分别对较小元素的子序列和较大元素的子序列重复步骤 1 和步骤 2
1 | function qSort(arr) { |