javascript 十大经典排序
首先生成一个数字数组:
let arr = Array.from({length:20},x=>{return Math.ceil(Math.random()*10**2)})
console.log(arr)
function fn(a,b){
return a-b;
} // console.log(arr.sort(fn))
function bubbleSort(a){
let k = 0;
let h = 0;
for(var i=0;i<a.length;i++){
for(var j=i+1;j<a.length;j++){
k++;
if(a[i] > a[j]){
h++;
[a[i],a[j]] = [a[j],a[i]];
}
}
}
console.log('o=',k,'h=',h);
return a;
}
console.log('bubbleSort', bubbleSort([].concat(arr)) ) function bubbleSort1(arr) {
var len = arr.length;
let k = 0;
let h = 0;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len - 1 - i; j++) {
k++;
if (arr[j] > arr[j+1]) { //相邻元素两两对比
h++;
[arr[j+1],arr[j]] = [arr[j],arr[j+1]];
}
}
}
console.log('o=',k,'h=',h);
return arr;
}
console.log('bubbleSort1', bubbleSort1([].concat(arr)) )
function selectionSort(a){
let k = 0;
let h = 0;a
for(var i=0;i<a.length;i++){
let tmp = a[i];
let pos = i;
for(var j=i+1;j<a.length;j++){
k++;
if(tmp>a[j]){
tmp=a[j];
pos = j;
h++;
}
}
if(tmp<a[i]){
[a[i], a[pos]] = [a[pos],a[i]];
}
} console.log('o=',k,'h=',h);
return a;
}
console.log('selectionSort', selectionSort([].concat(arr)) )
function insertionSort(arr){
let k=0;
let h=0;
for(var i=1;i<arr.length;i++){
let j = i;
let cur = arr[i];
let flag = false;
while(j>=0 && arr[j-1] > cur){
k++;
h++;
arr[j] = arr[j-1];
j--;
flag=true;
}
if(!flag){
k++;
}
arr[j]=cur;
}
console.log('o=',k,'h=',h);
return arr;
}
let insertArr = insertionSort([].concat(arr));
console.log('insertionSort', insertArr)
console.log('insertionSort', insertionSort(insertArr))
console.log('insertionSort', insertionSort(insertArr.reverse())) function insertionSort1(arr){
let k=0;
let h=0;
for(var i=1;i<arr.length;i++){
let cur = arr[i];
let left = 0;
let right = i-1;
while(left <= right){
k++;
let mid = parseInt((right+left)/2);
if(arr[mid] > cur){
right = mid -1;
}else{
left = mid + 1;
}
}
for(var j=i-1;j>=left;j--){
h++;
k++;
arr[j+1]=arr[j];
}
arr[left] = cur;
}
console.log('o=',k,'h=',h);
return arr;
} let insertArr1 = insertionSort1([].concat(arr));
console.log('insertionSort1', insertArr1)
console.log('insertionSort1', insertionSort1(insertArr1))
console.log('insertionSort1', insertionSort1(insertArr1.reverse()))
function shellSort(a){
let len = a.length;
let gap = 1;
let k=0;
let h=0
while(gap<(len/3)){
gap = gap*3+1;
}
for(gap;gap>0;gap=Math.floor(gap/3) ){
for(var i=gap;i<len;i++){
let cur = a[i];
for(var j=i-gap;j>=0 && cur < a[j];j-=gap){
k++;
h++;
a[j+gap] = a[j];
}
a[j+gap] = cur;
}
}
console.log('o=',k,'h=',h);
return a;
} let shellArr = shellSort([].concat(arr));
console.log('shellSort', shellArr)
console.log('shellSort', shellSort(shellArr))
console.log('shellSort', shellSort(shellArr.reverse()))
function merge(a,b){
let len1 = a.length;
let len2 = b.length;
let i=0,j=0;
let ret = [];
while(i<len1 && j<len2){
if(a[i]<b[j]){
ret.push(a[i]);
i++;
}else{
ret.push(b[j]);
j++;
}
}
if(i<len1){
ret = ret.concat(a.slice(i));
}
if(j<len2){
ret = ret.concat(b.slice(j));
}
return ret;
}
function mergeSort(a){
let len = a.length;
if(len == 1){
return a;
}
let mid=parseInt(len/2);
let left = a.slice(0,mid);
let right = a.slice(mid);
return merge(mergeSort(left),mergeSort(right));
} let mergeArr = mergeSort([].concat(arr));
console.log('mergeSort', mergeArr)
console.log('mergeSort', mergeSort(mergeArr))
console.log('mergeSort', mergeSort(mergeArr.reverse())) // 非递归
function mergeSort1(a){
let gap = 3;
let k=0;
for(gap;gap<a.length;gap=2*gap){
for(var i=0;i<a.length;i+=gap){
let r = [];
k++;
if((i+gap)>a.length){
r = merge(a.slice(i),[]);
}else{
let mid = parseInt((i+i+gap)/2);
let left = a.slice(i,mid);
let right = a.slice(mid,i+gap);
r = merge(left,right);
}
a.splice(i,r.length,...r);
}
if(gap*2>a.length){
a = merge(a.slice(0,gap),a.slice(gap, a.length));
}
}
console.log('k=',k)
return a;
} let mergeArr1 = mergeSort1([].concat(arr));
console.log('mergeSort1', mergeArr1)
console.log('mergeSort1', mergeSort1(mergeArr1))
console.log('mergeSort1', mergeSort1(mergeArr1.reverse()))
function quickSort(a){
if(a.length <= 1) return a;
let pivotIndex = Math.ceil(a.length/2);
let pivot = a.splice(pivotIndex,1)[0];
let left=[];
let right=[];
let k=0;
for(var i=0;i<a.length;i++){
k++;
if(a[i]<pivot){
left.push(a[i]);
}else{
right.push(a[i]);
}
}
console.log('k=',k)
return quickSort(left).concat([pivot],quickSort(right));
}
let quickArr = quickSort([].concat(arr));
console.log('quickSort', quickArr) function partition(a,left,right){
let pivot=a[right];
let i=left;
for(var j=left;j<=right;j++){
if(a[j]<pivot)
{
[a[i], a[j]]=[a[j],a[i]];
i++;
}
}
[a[i],a[right]]=[a[right],a[i]];
return i;
}
function quickSort1(a, left, right){
if(left<right){
let i = partition(a,left,right);
quickSort1(a,left,i-1);
quickSort1(a, i+1, right); }
return a;
} let quickArr1 = quickSort1([].concat(arr), 0, arr.length-1);
console.log('quickSort1', quickArr1);
function buildMaxHeap(a){
let len = a.length;
for(var i=Math.floor(len/2);i>=0;i--){
heapify(a,i,len);
} return a;
}
function heapify(a,i,len){
let left = 2*i+1;
let right = 2*i+2;
let largest = i;
if(left<len && a[left] > a[largest]){
largest = left;
}
if(right<len && a[right] > a[largest]){
largest = right;
}
if(largest != i){
[a[largest],a[i]] = [a[i],a[largest]];
heapify(a,largest,len);
}
}
function heapSort(a){
let len = a.length;
buildMaxHeap(a);
for(var i=(len-1);i>=0;i--){
[a[i],a[0]] = [a[0],a[i]];
heapify(a,0,--len);
}
return a;
} let heapArr1 = heapSort([].concat(arr), 0, arr.length-1);
console.log('heapSort', heapArr1);
function countingSort(a){
let max = 0;
let len = a.length;
let k=0; for(var i=0;i<len;i++){
if(max<a[i]){
max=a[i];
}
k++;
}
let bucket = new Array(max+1); for(var i=0;i<len;i++){
if(!bucket[a[i]]){
bucket[a[i]] = 0;
}
bucket[a[i]]++;
k++;
}
let h=0; // for(var j=1;j<max+1;j++){
// while(bucket[j]>0){
// a[h++] = j;
// bucket[j]--;
// }
// k++;
// }
// bucket.forEach((val,index)=>{
// while(val>0){
// a[h++] = index;
// val--;
// }
// k++;
// }) bucket.map((val,index)=>{
while(val>0){
a[h++] = index;
val--;
}
k++;
})
console.log('k=',k,h)
return a;
}
let countingArr1 = countingSort([].concat(arr), 0, arr.length-1);
console.log('countingSort', countingArr1);
function bucketSort(a){
let max = 0;
let min = 0;
let len = a.length;
let size = Math.ceil(len/3);
let count = 0;
for(var i=0;i<len;i++){
if(a[i]<min){
min = a[i];
}
if(a[i]>max){
max = a[i];
}
count++;
}
let bucketLen = Math.floor( (max-min)/size );
let bucket = new Array(bucketLen+1);
for(var j=0;j<bucketLen+1;j++){
bucket[j] = [];
count++;
}
for(var k=0;k<len;k++){
bucket[Math.floor((a[k]-min)/size)].push(a[k]);
count++;
} a.length = 0;
for(var l=0;l<bucketLen+1;l++){
countingSort(bucket[l]);
if(bucket[l].length>0){
a.push(...bucket[l]);
}
count++;
} console.log('count=',count);
return a;
} let bucketArr1 = bucketSort([].concat(arr), 0, arr.length-1);
console.log('bucketSort', bucketArr1);
function radixSort(a){
let bucket = new Array(11);
let max = Math.max(...a);
let len = max.toString().length;
let arrLen = a.length;
let count=0;
let rest = []; for(var i=0;i<len;i++){
bucket.length = 0;
for(var j=0;j<a.length;j++){
let str = a[j].toString();
if(str.length>i){
let index = str[str.length-1-i];
if(bucket[index] == null){
bucket[index] = [];
}
bucket[index].push(a[j]);
count++;
}else{
rest.push(a[j]);
}
}
a.length = 0;
bucket.forEach((val,index)=>{
a.push(...bucket[index]);
count++;
})
}
if(a.length<arrLen){
a=[].concat(rest,a);
}
console.log('count = ',count);
return a;
} let radixtArr1 = radixSort([].concat(arr), 0, arr.length-1);
console.log('radixSort', radixtArr1);
参考:
https://www.cnblogs.com/onepixel/p/7674659.html
https://www.cnblogs.com/jztan/p/5878630.html
https://www.cnblogs.com/vali/p/7803243.html
javascript 十大经典排序的更多相关文章
- JavaScript十大经典排序算法
排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- 十大经典排序算法的 JavaScript 实现
计算机领域的都多少掌握一点算法知识,其中排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大 ...
- 十大经典排序算法(Javascript实现)
前言 总括: 本文结合动图详细讲述了十大经典排序算法用Javascript实现的过程. 原文博客地址:十大经典排序算法 公众号:「菜鸟学前端」,回复「666」,获取一揽子前端技术书籍 人生有情泪沾衣, ...
- 十大经典排序算法(python实现)(原创)
个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...
- 十大经典排序算法+sort排序
本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...
- 一文搞定十大经典排序算法(Java实现)
本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一 ...
- 十大经典排序【Java实现,手工作坊式】
终于把排序这个硬骨头,但是又很基础的知识点,自己手撕了一遍!之前,使用Python看着算法导论的书手撕过一遍,印象不是很深刻,容易忘记!好记性不如烂笔头!多自己思考解决问题 1,交换类CAS[最简单] ...
- 十大经典排序算法最强总结(含JAVA代码实现)(转)
十大经典排序算法最强总结(含JAVA代码实现) 最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在“桶排序”算法中对每 ...
随机推荐
- Phoenix踩坑填坑记录
Phoenix踩坑填坑记录 Phoenix建表语句 如何添加二级索引 判断某表是否存在 判断索引是否存在 Date类型日期,条件判断 杂项 记录Phoenix开发过程中的填坑记录. 部分原文地址:ph ...
- mysql在8.0版本下修改密码的命令
ubuntu20.04上边部署了一个新的mysql服务,默认没密码,想要修改密码. 使用如下手段 第一种:ALTER USER 'root'@'localhost' IDENTIFIED BY '密码 ...
- rand()函数 不同区间 整数和浮点数
C++中rand()范围[0,RAND_MAX] 1.生成整数随机数,a b均为整数,且 [a,b)---rand()%(b-a)+a [a,b] ---rand()%(b-a+1)+a (a ...
- Flink-v1.12官方网站翻译-P016-Flink DataStream API Programming Guide
Flink DataStream API编程指南 Flink中的DataStream程序是对数据流实现转换的常规程序(如过滤.更新状态.定义窗口.聚合).数据流最初是由各种来源(如消息队列.套接字流. ...
- WPF 之 INotifyPropertyChanged 接口的使用 (一)
一.INotifyPropertyChanged 的基本概念 INotifyPropertyChanged 的作用:通知客户端属性值已经更改.详细信息见:INotifyPropertyChange ...
- linux(6)查看进程ps命令
ps命令 Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器 查看所有进程 ps -A 显示所有进程信息,连同命令行 ps - ...
- Codeforces Round #589 (Div. 2) Another Filling the Grid (dp)
题意:问有多少种组合方法让每一行每一列最小值都是1 思路:我们可以以行为转移的状态 附加一维限制还有多少列最小值大于1 这样我们就可以不重不漏的按照状态转移 但是复杂度确实不大行(减了两个常数卡过去的 ...
- Codeforces Round #644 (Div. 3) D. Buying Shovels (数学)
题意:商店里有\(k\)个包裹,第\(i\)个包裹中含有\(i\)个物品,现在想要买\(n\)物品,你可以选择某一个包裹购买任意次,使得物品数刚好等于\(n\),求最少的购买次数. 题解:首先,假如\ ...
- git仓库更换远程地址
首先进入项目所在文件夹,右键git bash (1)查看当前的远程地址 git remote -v (2)删除当前的远程地址 git remote rm origin (3)添加远程地址 git re ...
- markdown 公式编写及不同平台公式转换
1.markdown 用法及公式编写,这块就不再重复,已有很多官方平台的文档说明很完善 有道云markdown写作文档 在博客园中插入公式 markdown公式输入(特殊符号) markdown 特殊 ...