内外排序的区别

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

插入排序

直接插入排序

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function InsertSort (data, order=1) {
for (let i = 0; i<data.length; i++) {
let temp = data[i],
j = i-1; while(j>=0 && order ? temp < data[j] : temp > data[j]) {
data[j+1] = data[j];
j--;
} data[j+1] = temp;
} return data;
} console.log(InsertSort(data,0))

折半插入排序

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function reduceInsertSort(data) {
let temp, s,e,m;
for(let i = 1; i<data.length;i++) {
temp = data[i];
s = 0; e = i - 1;
while (s <= e) {
m = parseInt((s+e) / 2);
if(temp < data[m]) {
e = m - 1
} else {
s = m + 1
}
} for(j = i-1;j>=e+1;j--) {
data[j+1] = data[j];
}
data[e+1] = temp
}
return data;
} console.log(reduceInsertSort(data,1))

希尔排序

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function ShellSort (data, order=1) {
let gap = parseInt(data.length / 2); while (gap>0) {
// 间隔间进行插入排序
for (let i = gap; i<data.length; i++) {
let temp = data[i],
j = i - gap;
while(j>=0 && order ? temp < data[j] : temp > data[j]) {
data[j+gap] = data[j];
j -= gap;
} data[j+gap] = temp;
} gap = parseInt(gap/2);
} return data;
} console.log(ShellSort(data))

交换排序

冒泡排序

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function BubbleSort (data, order=1) {
for (let i = 0; i<data.length; i++) {
for (let j = i+1; j<data.length; j++) {
if (order ? data[i]<data[j] : data[i]>data[j]) {
data[j] -= data[i];
data[i] += data[j];
data[j] = data[i] - data[j];
}
}
}
return data;
} console.log(BubbleSort(data,1) + "");

快速排序

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function quickSort (data, order=1) {
return f(data); function f (arr) {
if (arr.length <= 1) { return arr; }
let d = 0,
temp = arr.splice(d, 1)[0],
l = [],
r = []; for (let i = 0; i < arr.length; i++) {
  if (order ? arr[i] < temp : arr[i] > temp) {
l.push(arr[i]);
  } else {
r.push(arr[i]);
  }
 }  return f(l).concat([temp], f(r));
}
}; console.log(quickSort(data,0));

选择排序

直接选择排序

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function choiceSort (data, order=1) {
for(let i = 0; i<data.length; i++) {
let temp = i;
for(let j = i; j<data.length; j++) {
if(order ? data[temp] > data[j] : data[temp] < data[j]) {
temp = j
}
} if(temp != i) {
data[temp] -= data[i];
data[i] += data[temp];
data[temp] = data[i] - data[temp]
}
}
return data;
} console.log(choiceSort(data));

堆排序

// 堆排序
var data = []; for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} /*
order: Number 顺序为1,逆序为0,
data: 排序数组
*/ function HeapSort(data, order=0) {
let len = data.length,
result = []; // 建立初始堆
for (let i = parseInt(len/2); i>=0大专栏  关于排序原生js实现span class="p">; i--) {
sift(i,len-1);
} for (let i = len; i>=1 ;i--) {
result.push(data[0]);
data[0] = data[i-1] sift(0,i-1);
} return result
// 堆化函数 s : 起始位置 e : 结束位置
function sift (s, e) {
let i = s, j = (2 * s) + 1, temp = data[s]; while (j<=e) {
if (data[j+1]) {
if (!order) {
(j<e && data[j] < data[j+1]) && (j++) // 比较左右子节点那个大,大的索引替换j
} else {
(j<e && data[j] > data[j+1]) && (j++) // 比较左右子节点那个大,大的索引替换j
}
} if (!order ? temp < data[j] : temp > data[j]) {
data[i] = data[j];
i = j;
j = (2 * j) + 1;
} else {
break;
}
}
data[i] = temp;
}
} console.log(HeapSort(data,1) + "");

归并排序

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function MergeSort(data, order=1) {
for(let len = 1; len < data.length; len *= 2) { // 每次归并数组的长度 len
let arr = [];
for(let j = 0; j <data.length;j+= 2 * (len)) {
arr.push(...merge(data.slice(j,j + len),data.slice(j+len,j + 2*len)))
// 每 len 个单位取一个数组,相邻两个间进行归并
}
data = arr;
}
return data; // 能够将两个顺序(逆序)数组,归并
function merge(arr1,arr2) {
let arr = [],
i = 0, j = 0;
while (i< arr1.length && j< arr2.length) {
if (order ? arr1[i] < arr2[j] : arr1[i] > arr2[j]) {
arr.push(arr1[i])
i++
} else {
arr.push(arr2[j])
j++
}
} if (i>= arr1.length) {
for(let k = j; k<arr2.length; k++) {
arr.push(arr2[k])
}
} else {
for(let k = i; k<arr1.length; k++) {
arr.push(arr1[k])
}
}
return arr;
}
} console.log(MergeSort(data,0));

基数排序

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

var data = [];

for (let i = 0; i<10;i++) {
data.push(Math.floor((Math.random()*-200) +100))
} function RadixSort (data, order=1) {
let d = 0,
positive = [], // 正数区间
negative = [], // 负数区间
result = [] // 确定最大基数 并将数组中的元素转化为字符串
for (let i = 0, value=""; i<data.length ; i++) {
value = Math.abs(data[i]).toString(); d = Math.max(d,value.length); if (data[i] >= 0) {
positive.push(value);
} else {
negative.push(value)
}
} // 顺序的话 order : 1 positive 从小到大, negative 从大到小
// 逆序反之 order : 0
for (let i = 1; i<=d; i++) {
let pTemp = new Array(10), nTemp = new Array(10); // 分别对正数区间和负数区间的对应基数的值进行分类
for (let j = 0; j<positive.length; j++) {
let value = positive[j],
flag = parseInt(value[value.length - i]),
key = 0; (!flag) && (flag = 0);
key = order ? flag : 10 - flag;
// 判断是否有队列
(!pTemp[key]) && (pTemp[key] = [])
pTemp[key].push(value);
} for (let j = 0; j<negative.length; j++) {
let value = negative[j],
flag = parseInt(value[value.length - i]),
key = 0; (!flag) && (flag = 0);
key = !order ? flag : 10 - flag;
(!nTemp[key]) && (nTemp[key] = [])
nTemp[key].push(value);
} positive = [];
negative = []; // 按照分类的标准出队
for (let i = 0; i<pTemp.length;i++) {
if(pTemp[i]) {
for(let j = 0;j<pTemp[i].length;j++) {
positive.push(pTemp[i][j])
}
}
}
for (let i = 0; i<nTemp.length;i++) {
if(nTemp[i]) {
for(let j = 0;j<nTemp[i].length;j++) {
negative.push(nTemp[i][j])
}
}
}
} // 将排好的结果 转化为数字,负数补上 负号
for(let i = 0;i<negative.length;i++) {
negative[i] = 0 - parseInt(negative[i])
} for(let i = 0;i<positive.length;i++) {
positive[i] = parseInt(positive[i])
} // 依据不同的要求 输出结果
if (order) {
return negative.concat(positive);
} else {
return positive.concat(negative);
}
} 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. 18)PHP,可变函数,匿名函数 变量的作用域

    (1)可变函数: 可变函数,就是函数名“可变”——其实跟可变变量一样的道理. $str1 = “f1”;   //只是一个字符串,内容为”f1” $v1 = $str1(3, 4);   //形式上看 ...

  2. 常见 Web 安全攻防总结

    Web 安全的对于 Web 从业人员来说是一个非常重要的课题,所以在这里总结一下 Web 相关的安全攻防知识,希望以后不要再踩雷,也希望对看到这篇文章的同学有所帮助.今天这边文章主要的内容就是分析几种 ...

  3. Educational Codeforces Round 66 差G

    Educational Codeforces Round 66 F 题意:长度为 n 的序列,求有多少个区间 \([l,r]\) ,使得其构成了一个 1~r-l+1 的排列. \(n \le 3*10 ...

  4. 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信

    题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...

  5. Matlab高级教程_第二篇:关于MATLAB转C#过程中MWArray到C#数组,C#数组到MWArray相互转换

    Matlab传递数据时使用的方法,那么Matlab计算完成后在C#中应该怎么获取它的计算数据呢? 需要遵循两个基本步骤: 弄清楚Matlab函数传回的数据到底是什么格式?struct?cell?cha ...

  6. 自定义字段从BOM带入生产用料清单

    自定义字段从BOM带入生产用料清单

  7. VBA自动点击IE的浏览按钮、自动选择路径、自动关闭打开文件对话框

    VBA调用InternetExplorer操作IE浏览器,自动弹出文件选择对话框时,VBA会处于阻塞状态,你必须手工关闭文件选择对话框,VBA才能继续向后运行. 例如下面网址,就有一个文件浏览按钮: ...

  8. 康耐视软件VisionPro-max-u与VisionPro-plus-u的区别

    康耐视软件VisionPro-max-u与VisionPro-plus-u的区别 1.VisionPro-plus-u为基础版可以直接运用该软件包的算法,拖拽式的窗口程序 2.VisionPro-ma ...

  9. OpenCV 亚像素级的角点检测

    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...

  10. hosts原理及作用

    https://blog.csdn.net/qq_41356488/article/details/82190372 手机也可以修改hosts,但是需要root权限,百度