内外排序的区别

排序可以分为两种:内排序和外排序。当数据量不算太大的时候,计算可以在内存中完成的排序称为内排序。当数据量特别大,计算的数据,需要分多次进入内存中进行计算的排序称之为外排序

插入排序

直接插入排序

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function InsertSort (data, order=1) {
  6. for (let i = 0; i<data.length; i++) {
  7. let temp = data[i],
  8. j = i-1;
  9. while(j>=0 && order ? temp < data[j] : temp > data[j]) {
  10. data[j+1] = data[j];
  11. j--;
  12. }
  13. data[j+1] = temp;
  14. }
  15. return data;
  16. }
  17. console.log(InsertSort(data,0))

折半插入排序

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function reduceInsertSort(data) {
  6. let temp, s,e,m;
  7. for(let i = 1; i<data.length;i++) {
  8. temp = data[i];
  9. s = 0; e = i - 1;
  10. while (s <= e) {
  11. m = parseInt((s+e) / 2);
  12. if(temp < data[m]) {
  13. e = m - 1
  14. } else {
  15. s = m + 1
  16. }
  17. }
  18. for(j = i-1;j>=e+1;j--) {
  19. data[j+1] = data[j];
  20. }
  21. data[e+1] = temp
  22. }
  23. return data;
  24. }
  25. console.log(reduceInsertSort(data,1))

希尔排序

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function ShellSort (data, order=1) {
  6. let gap = parseInt(data.length / 2);
  7. while (gap>0) {
  8. // 间隔间进行插入排序
  9. for (let i = gap; i<data.length; i++) {
  10. let temp = data[i],
  11. j = i - gap;
  12. while(j>=0 && order ? temp < data[j] : temp > data[j]) {
  13. data[j+gap] = data[j];
  14. j -= gap;
  15. }
  16. data[j+gap] = temp;
  17. }
  18. gap = parseInt(gap/2);
  19. }
  20. return data;
  21. }
  22. console.log(ShellSort(data))

交换排序

冒泡排序

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function BubbleSort (data, order=1) {
  6. for (let i = 0; i<data.length; i++) {
  7. for (let j = i+1; j<data.length; j++) {
  8. if (order ? data[i]<data[j] : data[i]>data[j]) {
  9. data[j] -= data[i];
  10. data[i] += data[j];
  11. data[j] = data[i] - data[j];
  12. }
  13. }
  14. }
  15. return data;
  16. }
  17. console.log(BubbleSort(data,1) + "");

快速排序

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function quickSort (data, order=1) {
  6. return f(data);
  7. function f (arr) {
  8. if (arr.length <= 1) { return arr; }
  9. let d = 0,
  10. temp = arr.splice(d, 1)[0],
  11. l = [],
  12. r = [];
  13. for (let i = 0; i < arr.length; i++) {
  14.   if (order ? arr[i] < temp : arr[i] > temp) {
  15. l.push(arr[i]);
  16.   } else {
  17. r.push(arr[i]);
  18.   }
  19.  }
  20.  return f(l).concat([temp], f(r));
  21. }
  22. };
  23. console.log(quickSort(data,0));

选择排序

直接选择排序

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function choiceSort (data, order=1) {
  6. for(let i = 0; i<data.length; i++) {
  7. let temp = i;
  8. for(let j = i; j<data.length; j++) {
  9. if(order ? data[temp] > data[j] : data[temp] < data[j]) {
  10. temp = j
  11. }
  12. }
  13. if(temp != i) {
  14. data[temp] -= data[i];
  15. data[i] += data[temp];
  16. data[temp] = data[i] - data[temp]
  17. }
  18. }
  19. return data;
  20. }
  21. console.log(choiceSort(data));

堆排序

  1. // 堆排序
  2. var data = [];
  3. for (let i = 0; i<10;i++) {
  4. data.push(Math.floor((Math.random()*-200) +100))
  5. }
  6. /*
  7. order: Number 顺序为1,逆序为0,
  8. data: 排序数组
  9. */
  10. function HeapSort(data, order=0) {
  11. let len = data.length,
  12. result = [];
  13. // 建立初始堆
  14. for (let i = parseInt(len/2); i>=0大专栏  关于排序原生js实现span class="p">; i--) {
  15. sift(i,len-1);
  16. }
  17. for (let i = len; i>=1 ;i--) {
  18. result.push(data[0]);
  19. data[0] = data[i-1]
  20. sift(0,i-1);
  21. }
  22. return result
  23. // 堆化函数 s : 起始位置 e : 结束位置
  24. function sift (s, e) {
  25. let i = s, j = (2 * s) + 1, temp = data[s];
  26. while (j<=e) {
  27. if (data[j+1]) {
  28. if (!order) {
  29. (j<e && data[j] < data[j+1]) && (j++) // 比较左右子节点那个大,大的索引替换j
  30. } else {
  31. (j<e && data[j] > data[j+1]) && (j++) // 比较左右子节点那个大,大的索引替换j
  32. }
  33. }
  34. if (!order ? temp < data[j] : temp > data[j]) {
  35. data[i] = data[j];
  36. i = j;
  37. j = (2 * j) + 1;
  38. } else {
  39. break;
  40. }
  41. }
  42. data[i] = temp;
  43. }
  44. }
  45. console.log(HeapSort(data,1) + "");

归并排序

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function MergeSort(data, order=1) {
  6. for(let len = 1; len < data.length; len *= 2) { // 每次归并数组的长度 len
  7. let arr = [];
  8. for(let j = 0; j <data.length;j+= 2 * (len)) {
  9. arr.push(...merge(data.slice(j,j + len),data.slice(j+len,j + 2*len)))
  10. // 每 len 个单位取一个数组,相邻两个间进行归并
  11. }
  12. data = arr;
  13. }
  14. return data;
  15. // 能够将两个顺序(逆序)数组,归并
  16. function merge(arr1,arr2) {
  17. let arr = [],
  18. i = 0, j = 0;
  19. while (i< arr1.length && j< arr2.length) {
  20. if (order ? arr1[i] < arr2[j] : arr1[i] > arr2[j]) {
  21. arr.push(arr1[i])
  22. i++
  23. } else {
  24. arr.push(arr2[j])
  25. j++
  26. }
  27. }
  28. if (i>= arr1.length) {
  29. for(let k = j; k<arr2.length; k++) {
  30. arr.push(arr2[k])
  31. }
  32. } else {
  33. for(let k = i; k<arr1.length; k++) {
  34. arr.push(arr1[k])
  35. }
  36. }
  37. return arr;
  38. }
  39. }
  40. console.log(MergeSort(data,0));

基数排序

基数排序比较特殊,是这几种排序中唯一不需要两者比较的一种算法。

  1. var data = [];
  2. for (let i = 0; i<10;i++) {
  3. data.push(Math.floor((Math.random()*-200) +100))
  4. }
  5. function RadixSort (data, order=1) {
  6. let d = 0,
  7. positive = [], // 正数区间
  8. negative = [], // 负数区间
  9. result = []
  10. // 确定最大基数 并将数组中的元素转化为字符串
  11. for (let i = 0, value=""; i<data.length ; i++) {
  12. value = Math.abs(data[i]).toString();
  13. d = Math.max(d,value.length);
  14. if (data[i] >= 0) {
  15. positive.push(value);
  16. } else {
  17. negative.push(value)
  18. }
  19. }
  20. // 顺序的话 order : 1 positive 从小到大, negative 从大到小
  21. // 逆序反之 order : 0
  22. for (let i = 1; i<=d; i++) {
  23. let pTemp = new Array(10), nTemp = new Array(10);
  24. // 分别对正数区间和负数区间的对应基数的值进行分类
  25. for (let j = 0; j<positive.length; j++) {
  26. let value = positive[j],
  27. flag = parseInt(value[value.length - i]),
  28. key = 0;
  29. (!flag) && (flag = 0);
  30. key = order ? flag : 10 - flag;
  31. // 判断是否有队列
  32. (!pTemp[key]) && (pTemp[key] = [])
  33. pTemp[key].push(value);
  34. }
  35. for (let j = 0; j<negative.length; j++) {
  36. let value = negative[j],
  37. flag = parseInt(value[value.length - i]),
  38. key = 0;
  39. (!flag) && (flag = 0);
  40. key = !order ? flag : 10 - flag;
  41. (!nTemp[key]) && (nTemp[key] = [])
  42. nTemp[key].push(value);
  43. }
  44. positive = [];
  45. negative = [];
  46. // 按照分类的标准出队
  47. for (let i = 0; i<pTemp.length;i++) {
  48. if(pTemp[i]) {
  49. for(let j = 0;j<pTemp[i].length;j++) {
  50. positive.push(pTemp[i][j])
  51. }
  52. }
  53. }
  54. for (let i = 0; i<nTemp.length;i++) {
  55. if(nTemp[i]) {
  56. for(let j = 0;j<nTemp[i].length;j++) {
  57. negative.push(nTemp[i][j])
  58. }
  59. }
  60. }
  61. }
  62. // 将排好的结果 转化为数字,负数补上 负号
  63. for(let i = 0;i<negative.length;i++) {
  64. negative[i] = 0 - parseInt(negative[i])
  65. }
  66. for(let i = 0;i<positive.length;i++) {
  67. positive[i] = parseInt(positive[i])
  68. }
  69. // 依据不同的要求 输出结果
  70. if (order) {
  71. return negative.concat(positive);
  72. } else {
  73. return positive.concat(negative);
  74. }
  75. }
  76. console.log(RadixSort(data,1))

结果虽然经过检测,但由于笔者才学疏浅,难免有些遗漏,如有问题,可以留言给我

关于排序原生js实现的更多相关文章

  1. 原生js实现table的排序

    原生js实现table的排序 今天遇到了一个问题就是使用原生js对table标签进行排序 一开始的时候陷入了一个误区就是首先获取table,然后每次比较完大小都会交换children的值,准备到最后吧 ...

  2. 原生JS面试题

    面试中遇到的原生js题总结   1.js 去重1) indexOf Array.prototype.unique = function(){ var result = []; var len = th ...

  3. 原生JS 基础总结

    0. 好习惯 分号 ; 花括号 {}, var 弄清楚 null , undefined 区别 , isNaN, === 与 == 区别 1. prompt , confirm , alert 不同框 ...

  4. 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

    1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...

  5. 基于原生JS封装数组原型上的sort方法

    基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...

  6. 原生Js汉语拼音首字母匹配城市名/自动提示列表

    根据城市的汉语名称首字母把城市排序,基本思路: 1.处理数据,按照需要的格式分别添加{HOT:{hot:[],ABCDEFG:{a:[1,2,3],b:[1,2,3]},HIGHLMN:{},OPQR ...

  7. 原生js的常用方法总结

    =============== 通知: 博主已迁至<掘金>码字,博客园可能以后不再更新,掘金地址:https://juejin.im/post/5a1a6a6551882534af25a8 ...

  8. 应该用forEach改变数组的值吗? 原生JS forEach()和map()遍历的异同点

    应该用forEach改变数组的值吗? https://segmentfault.com/q/1010000013170900?utm_source=index-hottest 由于js中的数组是引用类 ...

  9. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

随机推荐

  1. goweb-go语言基础

    go语言基础 虽然这本书是讲goweb,但还是吧go语言基础过了一遍,由于我之前已经对go语言基础做了一遍系统的学习,这里就当简单回顾一下,不再写过多笔记了,之前的写的博客都有基础知识,O(∩_∩)O ...

  2. 吴裕雄--天生自然TensorFlow高层封装:Keras-多输入输出

    # 1. 数据预处理. import keras from keras.models import Model from keras.datasets import mnist from keras. ...

  3. C# 使用 HttpPost 请求调用 WebService (转)

    转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...

  4. office 无法打开xlsx文件的问题

    1. 设置content-type和header response.setContentType("application/vnd.openxmlformats-officedocument ...

  5. Linux c 操作MySQL

    #include <mysql/mysql.h>#include <stdio.h>#include <stdlib.h>int main() { MYSQL *c ...

  6. 基于Dijsktra算法的最短路径求解

    基于Dijsktra算法的最短路径求解   描述 一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知.给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间 ...

  7. mysql 数据库保存\n 微信分享时不能换行

    主要因为保存的是\n 但是查询出来是\\n 所以需要把\\n替换为\n即可(不转换的话不会换行并且显示\n)

  8. uboot 编译

    . 解包u-boot源码包(u-boot-2016.07) . 配置交叉编译器 根据内核编译里的步骤配置 . 编译uboot yum install ncurses* // ncurses是个终端的图 ...

  9. 十七、linux系统磁盘管理

     1.    磁盘是存放许多重要数据的地方,所有了解磁盘是非常重要的.  2.    我们现在一块高达1000GB(1T)磁盘,就是3个盘前(1个3.5寸盘)组成.磁盘在工作的时候,盘片是高速旋转,磁 ...

  10. rest framework-视图和路由-长期维护

    ###############   三种视图    ############### # 第一种方法:使用mixins # class AuthorView(mixins.ListModelMixin, ...