1. 冒泡排序
// 从第一个开始一个一个向后比对、交换
// 改进了的冒泡排序
function sort (arr) {let len = arr.length,mark;for (let i = 0; i < len - 1; i++) {mark = 0;for (let j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j + 1]) {mark = 1;[arr[j], arr[j+1]] = [arr[j+1], arr[j]];}}if (!mark) {break}}return arr
}
  1. 选择排序
// 从i(令他最小),开始寻找包含i的最小的数,i++(循环前面步骤)
function sort (arr) {let len = arr.length,minIndex; //选择的最小值得indexfor (let i = 0; i < len - 1; i++) {minIndex = i;for (let j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {minIndex = j}}[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];}return arr;
}
  1. 希尔排序
// 先分为若干子序(通过间隔, 间隔逐渐缩小为1),再分别进行插入排序
function sort (arr) {let grap = 1,len = arr.length,cur,j;while(grap<len / 3) {grap = grap*3 +1}for (grap; grap > 0; grap = Math.floor(grap / 3)) {for (let i = grap; i < len; i++) {cur = arr[i];for (j = i - grap; j >= 0 && arr[j] > cur; j -= grap) {arr[j + grap] = arr[j];}arr[j + grap] = cur;console.log(arr)}}return arr
}
  1. 插入排序
// 从i=1 开始,默认i=0是有序,和前面序列比较找到合适位置插入
function sort (arr) {let len = arr.length,preindex,cur;for (let i = 1; i < len; i++) {preindex = i - 1;cur = arr[i];while(arr[preindex]>cur && preindex>=0) {arr[preindex + 1]  = arr[preindex];preindex--;}arr[preindex+1] = curconsole.log(arr)}return arr
}
  1. 归并排序
// 建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。先将其划分为若干最小块,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序  小 =》 大
function mergeSort (arr) {let len = arr.length;if (len < 2) {return arr}let midle = Math.ceil(len / 2),left = arr.slice(0, midle),right = arr.slice(midle);return merge(mergeSort(left), mergeSort(right))
}function merge (left, right) {let _arr = [];while(left.length>0 && right.length>0) {if (left[0] <= right[0]) {_arr.push(left.shift());} else {_arr.push(right.shift());}}if (left.length > 0) {_arr = _arr.concat(left)}if (right.length > 0) {_arr = _arr.concat(right);}console.log(_arr)return _arr;
}
  1. 快速排序
// 建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。先将其划分为若干最小块,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序  小 =》 大
function mergeSort (arr) {let len = arr.length;if (len < 2) {return arr}let midle = Math.ceil(len / 2),left = arr.slice(0, midle),right = arr.slice(midle);return merge(mergeSort(left), mergeSort(right))
}function merge (left, right) {let _arr = [];while(left.length>0 && right.length>0) {if (left[0] <= right[0]) {_arr.push(left.shift());} else {_arr.push(right.shift());}}if (left.length > 0) {_arr = _arr.concat(left)}if (right.length > 0) {_arr = _arr.concat(right);}console.log(_arr)return _arr;
}
  1. 堆排序
function heapSort (arr) {let len = arr.length;// 根据传入的i节点的位置调整一 i 为根节点的子树function heapify (arr, i) {let lChildIdx = 2 * i + 1 // 左孩子,rChildIdx = 2 * i + 2  // 右孩子,maxIdx = i;          // 此时设父节点为最大if (lChildIdx<len && arr[lChildIdx]>arr[maxIdx]) {maxIdx = lChildIdx;}if (rChildIdx<len && arr[rChildIdx]>arr[maxIdx]) {maxIdx = rChildIdx;}if (maxIdx !== i) {// 即 当前,某个子节点的值大于父节点,此时标记这个节点是父节点,更换现在父节点的值与实际父节点的值,[arr[maxIdx], arr[i]] = [arr[i], arr[maxIdx]];heapify(arr, maxIdx);}}// 构建大顶堆(升序), 二叉树非叶节点比叶节点少一个 Math.floor(len/2-1)// 从第一个叶节点开始,保证后面的顺序。for(let i = Math.floor(len / 2); i >= 0; i--){heapify(arr,i);}// 调整大顶堆,并排序for (let i = len-1; i >= 0; i--) {[arr[0], arr[i]] = [arr[i], arr[0]];len --; // 其中调整的是heapify(arr, 0);}return arr
}
  1. 计数排序
function countingSort(arr) {let len = arr.length,max = arr[0],countArr = [];// 寻找最大和最小 的indexfor (let i = 1; i < len; i++) {if (arr[i] > max) {max = arr[i];}}// 得到相应的大小countArr.length = max + 1;countArr.fill(0);// 技术开始for (let i = 0; i < len; i++) {countArr[arr[i]]++;}// 还原for (let i = 0, j = 0, len = countArr.length; i < len; i++) {for (let k = 0; k < countArr[i]; k++) {arr[j] = i;j++;}}return arr
}
  1. 桶排序
// 插入排序
function insertSort (arr) {let len = arr.length,preindex,cur;for (let i = 1; i < len; i++) {preindex = i - 1;cur = arr[i];while(arr[preindex]>cur && preindex>=0) {arr[preindex + 1]  = arr[preindex];preindex--;}arr[preindex+1] = cur}console.log(arr)return arr
}// 桶排序,一个桶相当于这个数组中的数的一个区间,不同范围的数在不同的桶,然后不同的桶内再排序,再对桶排序
function bucketSort (arr, len = arr.length) {const DEFAULT_BUCKET_SIZE = 5; // 桶大小,决定了这个桶最大数和最小数的最大的可能的差为 多少let min = arr[0],max = arr[0],bucketSize = DEFAULT_BUCKET_SIZE //,bucketCount,bucketArr = [];for (let i = 1; i < arr.length; i++) {if (arr[i] < min) {min = arr[i];                // 输入数据的最小值} else if (arr[i] > max) {max = arr[i];                // 输入数据的最大值}}// 桶和桶的数组初始化bucketCount = Math.floor((max - min) / bucketSize) + 1for (let i = 0; i < bucketCount; i++) {bucketArr[i]=[];}// 利用映射函数将数据分配到各个桶中for (let i = 0; i < arr.length; i++) {bucketArr[Math.floor((arr[i] - min) / bucketSize)].push(arr[i]);}arr = []; // 清空arrfor (let i = 0; i < bucketArr.length; i++) {insertSort(bucketArr[i]);                      // 对每个桶进行排序,这里使用了插入排序for (let j = 0; j < bucketArr[i].length; j++) {arr.push(bucketArr[i][j]);}}return arr;
}
  1. 基数排序
function radixSort(arr, maxDigit) {let mod = 10,dev = 1,counter = [],index; // 用于更新arrfor (let i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {counter = [];for(let j = 0; j < arr.length; j++) {let bucket = Math.floor((arr[j] % mod) / dev);if(!counter[bucket]) {counter[bucket] = [];}counter[bucket].push(arr[j]);}index = 0;for(let j = 0; j < counter.length; j++) {// 遍历这一列统一基数的数if(counter[j]) {for (let i = 0, len = counter[j].length; i < len; i++) {arr[index++] = counter[j][i]}}}}return arr;
}

参考地址1
参考地址2

js实现十大经典排序算法相关推荐

  1. js【详解】arr.sort()数组排序(内含十大经典排序算法的js实现)

    arr.sort()默认按照Unicode编码,从小到大进行排序,会改变原数组 let arr = ["e", "b", "d", &quo ...

  2. 十大经典排序算法解析及优化

    前言 在上篇文章<十大经典排序算法(动图演示)>中,已经能够了解各种排序算法的思想逻辑,虽然其中提供了代码,但对其解析却并不够全面,而且使用的是js来进行编写演示.本人根据其上代码转换为P ...

  3. 十大经典排序算法动画与解析,看我就够了

    作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...

  4. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  5. 11月14日云栖精选夜读 | 动画+原理+代码,解读十大经典排序算法

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过 ...

  6. Algorithm:【Algorithm算法进阶之路】之十大经典排序算法

    Algorithm:[Algorithm算法进阶之路]之十大经典排序算法 相关文章 Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 Algorithm:[Algori ...

  7. python经典排序_python实现十大经典排序算法

    写在前面 本文参考十大经典排序算法(动图演示),这篇文章有动图显示,介绍的很详细.本文是部分内容有借鉴此博客,用python实现,有一些改进. 各种算法的时间.空间复杂度 1.冒泡排序 1.比较相邻的 ...

  8. 十大经典排序算法总结(够兄弟们喝一壶的)

    Ⅰ.十大经典排序算法之插入排序及其二分优化:https://blog.csdn.net/Kevinnsm/article/details/114403557 Ⅱ.十大经典排序算法之冒泡排序及其优化:h ...

  9. 教小学妹学算法:十大经典排序算法深度解析

    最近有一位小学妹 Coco 入坑了算法,结果上来就被几个排序算法给整懵逼了,各种排序眼花缭乱,也分不清什么时候该用什么排序了. 今天呢,就在这分享一下我给小学妹讲十大经典排序算法的过程. 好吧,那我们 ...

最新文章

  1. 详解 Mysql LEFT JOIN和JOIN查询区别及原理
  2. ios 将矩形图片裁剪成圆形图片
  3. Win8.1下VM与Hyper-v冲突解决方法
  4. Android SystemServer分析
  5. python元类使用场景_Python元类使用简介
  6. Leetcode每日一题:463.island-perimeter(岛屿的周长)
  7. Mybatis常见的面试题
  8. AMS1117典型电路
  9. 图灵5月书讯※特别制作【MongoDB将在5月中旬隆重上市】
  10. Oracle数据库新增字段
  11. PPT插入Excel图标,如果水平翻转做出漂亮逻辑图表?
  12. oracle 拼音首字母查询,使用ORACLE函数实现按汉字拼音首字母查询
  13. 怎么让抖音视频当做铃声android,抖音短视频设置手机铃声教程_苹果手机怎么设置抖音手机铃声_3DM手游...
  14. 关闭和开启笔记本自带键盘。
  15. (Tekla Structures二次开发)创建多边形板
  16. 怎么将计算机的触摸鼠标锁定,戴尔笔记本触摸鼠标怎么锁定
  17. 登录网络计算机提示用户名错误,局域网访问共享时提示登录失败:未知的用户名或错误密码 怎么回事...
  18. mac mini调整屏幕亮度
  19. 你真的了解java编译优化吗?15个问题考察自己是否理解
  20. Linux下的常用编程工具初探

热门文章

  1. zzzfun网站连接不上服务器,ZzzFun
  2. win10切换输入法快捷键_Win10发布四年,这30个技巧还有很多人不知道!
  3. 颜色不透明度 对应表
  4. 杰力科创七彩灯雾化器芯片--DLT8P60SC
  5. Excel シートインポート、Excel シートエクスポート
  6. 大疆云台如何使用华为mate20pro_大疆灵眸手机云台3软件升级 完美支持Mate30系列...
  7. Powerbi环比分析及其修正
  8. 龙芯Fedora21平台制作feodra21-loongson-app docker镜像
  9. 乔治亚大学计算机科学,乔治亚大学的计算机科学排名,真得稳重考察
  10. java 拼音首字母_java获取中文拼音首字母的实例