前言

排序算法是《数据结构和算法》中比较基础的算法

常见的排序算法有:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

算法总览

JavaScript之排序算法篇(上) - 图2

冒泡排序

算法步骤

  1. 从头开始,比较相邻的两个数,如果第一个数大于第二个数,就交换他们两个的位置
  2. 然后从交换的位置开始,继续执行第1步的比较策略
  3. 经过一轮循环之后,最大的数就会被放到最后
  4. 重复上面的步骤,知道没有任何一对数字需要比较

动图演示

JavaScript之排序算法篇(上) - 图3

代码实现

  1. // 冒泡排序
  2. function bubbleSort(arr) {
  3. var len = arr.length;
  4. for (let i = 0; i < len - 1; i++) {
  5. for (let j = 0; j < len - 1 - i; j++) {
  6. if (arr[j] > arr[j+1]) {
  7. var temp = arr[j+1];
  8. arr[j+1] = arr[j];
  9. arr[j] = temp;
  10. }
  11. }
  12. }
  13. return arr;
  14. }

选择排序

算法步骤

  1. 在未排序的序列中找到最小元素,放到排序序列的起始位置
  2. 从剩下未排序的元素中继续寻找最小的元素,放到已排序序列的末尾
  3. 重复第2步骤,到所有元素排列完毕

动图演示

JavaScript之排序算法篇(上) - 图4

代码实现

  1. // 选择排序
  2. function selectionSort(arr) {
  3. let len = arr.length;
  4. let minIndex;
  5. for (let i = 0; i < len - 1; i++) {
  6. minIndex = i;
  7. for (let j = i + 1; j < len; j++) {
  8. if (arr[j] < arr[minIndex]) {
  9. minIndex = j;
  10. }
  11. }
  12. let temp = arr[j];
  13. arr[i] = arr[minIndex];
  14. arr[minIndex] = temp;
  15. }
  16. return arr;
  17. }

插入排序

算法步骤

  1. 将第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列
  2. 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置,相等的话就排到相等元素的后面

动画演示

JavaScript之排序算法篇(上) - 图5

代码实现

  1. // 插入排序
  2. function insertionSort(arr) {
  3. let len = arr.length;
  4. let preIndex, current;
  5. for (let i = 1; i < len; i++) {
  6. preIndex = i - 1;
  7. current = arr[i];
  8. while(preIndex >= 0 && arr[preIndex] > current) {
  9. arr[preIndex+1] = arr[preIndex];
  10. preIndex--;
  11. }
  12. arr[preIndex+1] = current;
  13. }
  14. return arr;
  15. }

希尔排序

算法步骤

  1. 按照希尔排序的初稿,先设置增量gaplen / 2,并进行分组排序
  2. 设置增量gap为原来的一半,继续对分组进行排序
  3. 重复以上的步骤,知道gap值为1

动画演示JavaScript之排序算法篇(上) - 图6

代码实现

  1. // 希尔排序
  2. function shellSort(arr) {
  3. let len = arr.length;
  4. let gap = Math.floor(len / 2);
  5. while (gap > 0) {
  6. for (let i = gap; i < len; i++) {
  7. let j = i;
  8. let temp = arr[i];
  9. while (j > gap - 1 && arr[j - gap] > temp) {
  10. arr[j] = arr[j - gap];
  11. j = j - gap;
  12. }
  13. arr[j] = temp;
  14. }
  15. gap = Math.floor(gap / 2);
  16. }
  17. return arr;
  18. }