冒泡排序

算法描述

  • 比较相邻的元素 如果第一个比第二个大 那么交换两个的位置
  • 对每一个相邻的元素做相同的工作 从开始的第一个对 到最后一对 这样最后的元素应该就是最大数
  • 针对所有元素重复以上的步骤 除了最后一个
  • 重复1~3部 直到排序完成

    动画演示

十大经典排序算法 - 图1

代码实现

  1. function bubble(arr) {
  2. var len = arr.length
  3. for (let i = 0; i < len - 1; i++) {
  4. for (let j = 0; j < len - 1 - i; j++) {
  5. if (arr[j] > arr[j + 1]) {
  6. var temp = arr[j]
  7. arr[j] = arr[j + 1]
  8. arr[j + 1] = temp
  9. }
  10. }
  11. }
  12. }

选择排序

选择排序是一种简单直观的排序算法,他的工作原理: 首先在未排序的序列中找到最小的元素 存放在已排序的序列的器起始位置,然后再从剩余未排序的元素中继续寻找最小的元素 然后放到已排序序列的末尾 以此类推 直到所有的元素排序完毕

动画演示

十大经典排序算法 - 图2

代码实现

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

插入排序

插入排序的算法描述是一种简单直观的排序算法 他的工作原理是通过构建有序序列 对于未排序的数据 在已排序的序列中从后向前扫描 找响应的位置并插入

算法描述

  • 从第一个元素开始 该元素可以认为是已被排序的
  • 取出下一个元素 在已经排序的元素的序列从后向前扫描
  • 如果该元素大于新元素 将该元素移到下一个位置
  • 重复步骤3 直到找到排序元素小于或者等于新元素的位置
  • 将新元素插入到该位置
  • 重复步骤2~5

    动画演示

十大经典排序算法 - 图3

代码实现

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

举例说明

[8, 20, 30, 15, 25]
8 20 30 属于已排序
15 25 属未排序
15 一直往前挪
先跟30交换位置 [8, 20,15,30,25]
再跟20交换位置 [8, 15,20,30,25]
done

希尔排序

希尔排序是第一个突破O(n2)的排序算法 是简单排序的改进版 他与插入排序不同的是 它会优先选择距离较远的元素 希尔排序又叫缩小增量排序
。。。TMD 看不懂

归并排序

归并排序是建立在归并操作上的一种有效排序算法 该算法是采用分治法的一个典型应用 将已有的子序列合并 得到完全有序的序列 即先使每个子序列有序 再使子序列段有序
若将两耳有序表合并成一个有序表 成为2路归并

算法描述

  • 把长度为n的输入序列分为两个长度为n/2的子序列
  • 将两个子序列分别采用归并排序
  • 将两个排序好的子序列合并成一个最终排序序列

    代码实现

    ```javascript function mergeSort(arr) {

    var len = arr.length if (len < 2) { return arr } var mid = Math.floor(len / 2) var left = arr.slice(0, mid) var right = arr.slice(mid) return merge(mergeSort(left), mergeSort(right)) }

function merge(left, right) { var result = [] while (left.length > 0 && right.length > 0) { if (left[0] >= right[0]) { result.push(right.shift()) } else { result.push(left.shift()) } } while(left.length){ result.push(left.shift()) } while(right.length){ result.push(right.shift()) } return result

}

var arr = [34,335,2,344,54,7,3,345,377,565] console.log(mergeSort(arr)) ```

快速排序

快速排序的基本思想 通过一趟排序将待排记录分割成独立的两部分 其中一部分记录的关键字均比另一部分的关键字小 则可分别对这两部分进行排序已达到整个序列有序

算法描述

  • 从数列中挑出一个元素 成为基准
  • 重新排序数列,将所有比基准值小的摆在前面 所有比基准值大的摆在后面 在这个分区退出之后 该基准就位于数列中间位置
  • 递归地把小于基准值的子数列 和 大于基准值的子数列排序

    动图演示

    十大经典排序算法 - 图4

代码实现

https://www.cnblogs.com/onepixel/p/7674659.html