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代码实现) 最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在“桶排序”算法中对每 ...
随机推荐
- Spark Dataset DataFrame空值null,NaN判断和处理
Spark Dataset DataFrame空值null,NaN判断和处理 import org.apache.spark.sql.SparkSession import org.apache.sp ...
- 华三交换机NTP配置
clock protocol ntp ntp-service enable ntp-service unicast-server x.x.x.x clock timezone beijing add ...
- go语言常见面试题
前言 从网上找了一些面试题,觉得有意思的我都记录下来,自己学习和大家一起学习吧. 有些初级的题目只放答案,一些值得探讨的问题我会写上我自己的分析过程,希望大家多多交流. 原文链接 选择题 1.[初级] ...
- Eureka详解系列(四)--Eureka Client部分的源码和配置
简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...
- HDFS读写流程(转载)
概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现.特点如下: 能够运行在廉价机器上,硬件出错常态,需要具备高容错性 ...
- Codeforces Round #646 (Div. 2) E. Tree Shuffling(树上dp)
题目链接:https://codeforces.com/contest/1363/problem/E 题意 有一棵 $n$ 个结点,根为结点 $1$ 的树,每个结点有一个选取代价 $a_i$,当前 $ ...
- Atlas 分表功能
目录 分表原因 分表方式 Atlas 分表 分表思路 配置 Atlas 创建原表 创建分表 数据测试 分表原因 1.数据过多,访问缓慢 2.创建索引时重新排序,创建缓慢,并且占用大量的磁盘空间 分表方 ...
- Python——Django框架——邮件
#引用EMAIL服务 EMAIL_BACKEND = 'django.cpre.mail.backends.smtp.EmailBackend' #EMAIL发送服务器 EMAIL_HOST = 's ...
- woj1005-holding animals-01pack woj1006-Language of animals-BFS
title: woj1005-holding animals-01pack date: 2020-03-05 categories: acm tags: [acm,woj,pack] 01背包.中等题 ...
- codeforces 1016C - Vasya And The Mushrooms 【构造 + 思维】
题目链接:戳这里 题意:从(1,1)出发,一遍把格子走完,每个格子只能走一次.问怎么走总和最大. 解题思路:画图可知,总共就3种走法的混合. dw: 样例1的走法 up: 样例1反过来的走法 lp: ...