JavaScript实现八大内部排序算法

注:基数排序中:r是关键字的基数,d是长度,n是关键字的个数
 function insertSort(arr) {
   for (let i = 1; i < arr.length; i++) {
     // 将待插入元素提取出来
     let temp = arr[i]
     let j
     for (j = i - 1; j >= 0; j--) {
       if (arr[j] > temp) {
         // 插入元素小于比较元素,比较元素则向后移动一位
         arr[j + 1] = arr[j]
       } else {
         // 否则,结束移位
         break
       }
     }
     //将插入元素插入正确位置
     arr[j + 1] = temp
   }
   return arr
 }
 console.log(insertSort([7, 3, 4, 5, 10, 7, 8, 2]))
 function binarySort(arr) {
   for (let i = 0; i < arr.length; i++) {
     let temp = arr[i]
     let left = 0
     let right = i - 1
     let mid
     while (left <= right) {
       mid = Math.floor((left + right) / 2)
       if (arr[mid] > temp) {
         right = mid - 1
       } else {
         left = mid + 1
       }
     }
     for (let j = i - 1; j >= left; j--) {
       arr[j + 1] = arr[j]
     }
     if (left !== i) {
       arr[left] = temp
     }
   }
   return arr
 }
 console.log(binarySort([7, 3, 4, 5, 10, 7, 8, 2]))
 function shellSort(arr) {
   let d = arr.length
   while (true) {
     d = Math.floor(d / 2)
     for (let x = 0; x < d; x++) {
       for (let i = x + d; i < arr.length; i = i + d) {
         let temp = arr[i]
         let j
         for (j = i - d; j >= 0 && arr[j] > temp; j = j - d) {
           arr[j + d] = arr[j]
         }
         arr[j + d] = temp
       }
     }
     if (d == 1) {
       break
     }
   }
   return arr
 }
 console.log(shellSort([7, 3, 4, 5, 10, 7, 8, 2]))
 function directSelectSort(arr) {
   for (let i = 0; i < arr.length; i++) {
     let min = arr[i]
     let index = i
     for (let j = i + 1; j < arr.length; j++) {
       if (arr[j] < min) {
         // 找到最小值,并标注最小值索引,方便后续与元素arr[i]交换位置
         min = arr[j]
         index = j
       }
     }
     arr[index] = arr[i]
     arr[i] = min
   }
   return arr
 }
 console.log(directSelectSort([7, 3, 4, 5, 10, 7, 8, 2]))
 let len
 function buildMaxHeap(arr) {
   //建立大根堆
   len = arr.length
   for (let i = Math.floor(len / 2); i >= 0; i--) {
     heapify(arr, i)
   }
 }
 function heapify(arr, i) {
   //堆调整
   let left = 2 * i + 1,
     right = 2 * i + 2,
     largest = i
   if (left < len && arr[left] > arr[largest]) {
     largest = left
   }
   if (right < len && arr[right] > arr[largest]) {
     largest = right
   }
   if (largest !== i) {
     // 解构赋值,交换变量
     ;[arr[i], arr[largest]] = [arr[largest], arr[i]]
     heapify(arr, largest)
   }
 }
 function heapSort(arr) {
   buildMaxHeap(arr)
   for (let i = arr.length - 1; i > 0; i--) {
     ;[arr[0], arr[i]] = [arr[i], arr[0]]
     len--
     heapify(arr, 0)
   }
   return arr
 }
 console.log(heapSort([7, 3, 4, 5, 10, 7, 8, 2]))
 function bubbleSort(arr) {
   for (let i = 0; i < arr.length; i++) {
     // 因为每次比较时都已经有i个元素沉下去了,所以j<arr.length-1-i
     for (let j = 0; j < arr.length - 1 - i; j++) {
       if (arr[j] > arr[j + 1]) {
         // 这里采用了解构赋值。如果一般做法,借助临时变量,则辅助空间是O(1)
         ;[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
       }
     }
   }
   return arr
 }
 console.log(bubbleSort([7, 3, 4, 5, 10, 7, 8, 2]))
 let quicksort = function(arr) {
   if(arr.length <= 1) return arr;
   let pivot = Math.floor((arr.length -1)/2);
   let val = arr[pivot], less = [], more = [];
   arr.splice(pivot, 1);
   arr.forEach(function(e,i,a){
     e < val ? less.push(e) : more.push(e);
   });
   return (quicksort(less)).concat([val],quicksort(more))
 }
 console.log(quicksort([7, 3, 4, 5, 10, 7, 8, 2]))
 function merge(left, right) {
   let result = []
   while (left.length > 0 && right.length > 0) {
     if (left[0] < right[0]) {
       /*shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。*/
       result.push(left.shift())
     } else {
       result.push(right.shift())
     }
   }
   return result.concat(left).concat(right)
 }
 function mergeSort(arr) {
   if (arr.length == 1) {
     return arr
   }
   let middle = Math.floor(arr.length / 2),
     left = arr.slice(0, middle),
     right = arr.slice(middle)
   return merge(mergeSort(left), mergeSort(right))
 }
 console.log(mergeSort([7, 3, 4, 5, 10, 7, 8, 2]))
// LSD Radix Sort
// helper function to get the last nth digit of a number
var getDigit = function(num,nth){
// get last nth digit of a number
var ret = 0;
while(nth--){
ret = num % 10
num = Math.floor((num - ret) / 10)
}
return ret
} // radixSort
function radixSort(arr){
var max = Math.floor(Math.log10(Math.max.apply(Math,arr))),
// get the length of digits of the max value in this array
digitBuckets = [],
idx = 0; for(var i = 0;i<max+1;i++){ // rebuild the digit buckets according to this digit
digitBuckets = []
for(var j = 0;j<arr.length;j++){
var digit = getDigit(arr[j],i+1); digitBuckets[digit] = digitBuckets[digit] || [];
digitBuckets[digit].push(arr[j]);
} // rebuild the arr according to this digit
idx = 0
for(var t = 0; t< digitBuckets.length;t++){
if(digitBuckets[t] && digitBuckets[t].length > 0){
for(j = 0;j<digitBuckets[t].length;j++){
arr[idx++] = digitBuckets[t][j];
}
}
}
}
return arr
}
console.log(radixSort([7, 3, 4, 5, 10, 7, 8, 2]))
注:网上有很多javascript实现的基数排序代码时错误的
当搜索一些问题时,尽量使用英文进行搜索!
JavaScript实现八大内部排序算法的更多相关文章
- Java实现各种内部排序算法
		数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ... 
- 常见内部排序算法对比分析及C++ 实现代码
		内部排序是指在排序期间数据元素全部存放在内存的排序.外部排序是指在排序期间全部元素的个数过多,不能同时存放在内存,必须根据排序过程的要求,不断在内存和外存之间移动的排序.本次主要介绍常见的内部排序算法 ... 
- 用 Java 实现常见的 8 种内部排序算法
		一.插入类排序 插入类排序就是在一个有序的序列中,插入一个新的关键字.从而达到新的有序序列.插入排序一般有直接插入排序.折半插入排序和希尔排序. 1. 插入排序 1.1 直接插入排序 /** * 直接 ... 
- JavaScript实现常用的排序算法
		▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ... 
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
		写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ... 
- JavaScript十大经典排序算法
		排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ... 
- JavaScript的9大排序算法详解
		一.插入排序 1.算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. ... 
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
		一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法 ... 
- 必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序
		冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个 ... 
随机推荐
- Maven2的配置文件settings.xml
			简介: 概览 当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用settings.xml中的settings元素来确定这些配置.这包含 ... 
- android wear开发之:建立可穿戴设备的应用 - Building Apps for Wearables
			注:本文内容来自:https://developer.android.com/training/building-wearables.html 翻译水平有限,如有疏漏,欢迎批评指教. 译:山人 建立可 ... 
- SQL中锁表语句简单理解(针对于一个表)
			锁定数据库的一个表 复制代码代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 复制代码代码如下: SELECT * FROM tab ... 
- invalid LOC header
			今天在SSM整合的时候,报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost].但是就是不明白原因所 ... 
- MXNet之ps-lite及parameter server原理
			MXNet之ps-lite及parameter server原理 ps-lite框架是DMLC组自行实现的parameter server通信框架,是DMLC其他项目的核心,例如其深度学习框架MXNE ... 
- 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言
			基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ... 
- ServletFileUpload 图片上传
			<script type="text/javascript"> $(function () { $('#uploadSubmit').click(function () ... 
- idea for Mac 日常配置&快捷键
			配置: 1.jdk:file > project structure -- Project SDK; 快捷键: geter adn seter :command+n command+点到具体方法 ... 
- Python 爬虫练习(三)  利用百度进行子域名收集
			不多介绍了,千篇一律的正则匹配..... import requests import re head = {'User-Agent': \ 'Mozilla/5.0 (Windows NT 6.3; ... 
- 《Metasploit魔鬼训练营》第七章学习笔记
			P314 木马程序的制作 msfpayload和msfencoder已被msfvenom取代.使用msfvenom -h查看具体用法.以下网址也有相关教程: https://github.com/ra ... 
