js排序方法
function swap(ary, x, y) {
if (x === y) return
let temp = ary[x]
ary[x] = ary[y]
ary[y] = temp
}
//生成随机数:
function random(n) {
let ary = new Array(n)
return ary.fill().map(_ => Math.random() * n | )
}
//选择排序( 不稳定):
function selectSort(ary) {
for (var i = ; i < ary.length - ; i++) {
let min = i
let change
for (var j = i + ; j < ary.length; j++) {
if (ary[j] < ary[min]) {
min = j
}
}
swap(ary, min, i)
// change = ary[min]
// ary[min] = ary[i]
// ary[i] = change
}
return ary
}
//冒泡排序:
function bubbleSort(ary, comparator) {
let flag
let l = ary.length
for (let i = l - ; i >= ; i--) {
flag = false
for (let j = ; j < i; j++) {
//if (ary[j + 1] < ary[j]) {
if (comparator(ary[j], ary[j + ]) > ) {
flag = true
swap(ary, j, j + )
}
}
if (!flag) {
break
}
}
return ary
}
function comparator(a, b) {
if (a > b) {
return
} else {
return -
}
}
//归并排序 稳定的
function mergeSort(ary) {
if (ary.length < ) {
return ary.slice()
}
var mid = Math.floor(ary.length / )
var left = mergeSort(ary.slice(, mid))
var right = mergeSort(ary.slice(mid))
var result = []
while (left.length && right.length) {
if (left[] <= right[]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
result.push(...left, ...right)
return result
}
//快速排序:
function partition(ary, comparator, start = , end = ary.length - , ) {
if (start >= end) {
return
}
var pivotIndex = Math.floor(Math.random() * (end - start + ) + start)
var pivot = ary[pivotIndex]
swap(ary, pivotIndex, end)
for (var i = start - , j = start; j < end; j++) {
if (comparator(ary[j], pivot) < ) {
i++
swap(ary, i, j)
}
}
swap(ary, i + , end)
partition(ary, comparator, start, i)
partition(ary, comparator, i + , end)
return ary
}
function quickSort(ary, comparator = (a, b) => a - b) {
return partition(ary, comparator)
}
//堆排序
// function reheap(ary, topIndex, endIndex = ary.length - 1) {
// if (topIndex > endIndex) {
// return
// }
// var largestIndex = topIndex
// var leftIndex = topIndex * 2 + 1
// var rightIndex = topIndex * 2 + 1
// if (leftIndex <= endIndex && ary[leftIndex] > ary[largestIndex]) {
// largestIndex = leftIndex
// }
// if (rightIndex <= endIndex && ary[rightIndex] > ary[largestIndex]) {
// largestIndex = rightIndex
// }
// if (largestIndex !== topIndex) {
// swap(ary, largestIndex, topIndex)
// reheap(ary, largestIndex, endIndex)
// }
// }
// function heapify(ary) {
// for (var i = ary.length - 1; i >= 0; i--) {
// reheap(ary, i)
// }
// return ary
// }
// function heapSort(ary) {
// heapify(ary)
// for (var i = ary.length - 1; i >= 1; i--) {
// swap(ary, 0, i)
// reheap(ary, 0, i - 1)
// }
// return ary
// }
function reheap(ary, topIndex, endIndex = ary.length - ) {
if (topIndex > endIndex) {
return
}
var largestIndex = topIndex
var leftIndex = topIndex * +
var rightIndex = topIndex * +
if (leftIndex <= endIndex && ary[leftIndex] > ary[largestIndex]) {
largestIndex = leftIndex
}
if (rightIndex <= endIndex && ary[rightIndex] > ary[largestIndex]) {
largestIndex = rightIndex
}
if (largestIndex != topIndex) {
swap(ary, largestIndex, topIndex)
reheap(ary, largestIndex, endIndex)
}
}
//把一个数组调整成一个堆
function heapify(ary) {
for (var i = ary.length - ; i >= ; i--) {
reheap(ary, i)
}
return ary
}
// 堆排序
function heapSort(ary) {
heapify(ary)
for (var i = ary.length - ; i >= ; i--) {
swap(ary, , i)
reheap(ary, , i - )
}
return ary
}
class PriorityQueue {
constructor(comparator = (a, b) => a - b) {
this.heap = []
this.comparator = comparator
}
_show() {
return
showTree(el, this.heap)
}
_swap(i, j) {
if (i !== j) {
var temp = this.heap[i]
this.heap[i] = this.heap[j]
this.heap[j] = temp
}
this._show()
return this
}
_reverseReheap(pos) {
var parentPos = (pos - ) / |
if (parentPos >= && this.comparator(this.heap[pos], this.heap[parentPos]) < ) {
this._swap(pos, parentPos)
this._reverseReheap(parentPos)
}
}
push(val) {
this.heap.push(val)
this._reverseReheap(this.heap.length - )
}
_reheap(topIndex, endIndex = this.heap.length - ) {
if (topIndex > endIndex) {
return
}
var ary = this.heap
var largestIndex = topIndex
var leftIndex = topIndex * +
var rightIndex = topIndex * +
if (leftIndex <= endIndex && this.comparator(ary[leftIndex], ary[largestIndex]) < ) {
largestIndex = leftIndex
}
if (rightIndex <= endIndex && this.comparator(ary[rightIndex], ary[largestIndex]) < ) {
largestIndex = rightIndex
}
if (largestIndex != topIndex) {
swap(ary, largestIndex, topIndex)
this._reheap(largestIndex, endIndex)
}
}
pop() {
if (heap.length === ) {
return this.heap.pop()
}
var result = this.heap[]
this.heap[] = this.heap.pop()
this._reheap()
return result
}
}
请给你自己加油!
js排序方法的更多相关文章
- 【js基础】js排序方法——快排+堆排+插排+选择排
快排 Array.prototype.fastSort = function(){ var arr = this; function sort(left, right, arr){ if( left ...
- js 排序:sort()方法、冒泡排序、二分法排序。
js中的排序,这里介绍三种,sort()方法.冒泡排序.二分法排序. 1.sort方法 写法: 数组.sort(); 返回排好序的数组,如果数组里是数字,则由小到大,如果是字符串,就按照第一个字符的 ...
- js中的数组对象排序(方法sort()详细介绍)
定义和用法 sort() 方法用于对数组的元素进行排序. 语法 arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意 ...
- JS学习笔记(3)--json格式数据的添加,删除及排序方法
这篇文章主要介绍了json格式数据的添加,删除及排序方法,结合实例形式分析了针对一维数组与二维数组的json格式数据进行增加.删除与排序的实现技巧,需要的朋友可以参考下 本文实例讲述了json格式 ...
- js sort方法根据数组中对象的某一个属性值进行排序(实用方法)
js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {nam ...
- 各种排序方法的JS实现
各种排序算法的对比总结如下表所示: 冒泡排序: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
- js 几种排序方法
1.冒泡排序 var arr = [9, 7, 5, 3, 1]; for (var i = 0; i < arr.length - 1; i++) { for (var j = 0; j &l ...
- js字符串排序方法
前端开发过程中有时需自己手写排序方法 一般想到数字的字符串排序方法 我们会用到 var newArr = arr. sort(function(a,b){return a - b})来进行排序 但除此 ...
- 排序图解:js排序算法实现
之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...
随机推荐
- usb-cam (3)摄像机标定文件-ORB-SLAM标定文件
http://www.luohanjie.com/2017-04-05/the-problem-of-calibration-data-in-orb-slam2.html ORB_SLAM2中标定数据 ...
- go标准库的学习-encoding/json
参考https://studygolang.com/pkgdoc 导入方式: import "encoding/json" json包实现了json对象的编解码,参见RFC 462 ...
- metamask源码学习-inpage.js
The most confusing part about porting MetaMask to a new platform is the way we provide the Web3 API ...
- k8s搭建问题(1)--OOMKilled
kubectl describe pods ****** --namespace=****** 现象 Host Port: /TCP State: Waiting Reason: CrashLoopB ...
- nginx做负载均衡和tomcat简单集群
Nginx做负载均衡和TOMCAT简单集群 1.下载安装nginx及其依赖包 ...
- 理解socket.io(一)---相关的API
理解socket.io(一)---相关的API 1. 什么是Socket.IO?Socket.IO是node.js的一个模块,它用于浏览器与服务端之间实时通信.它提供了服务器和客户端的组件,只需一个模 ...
- PAT A1110 Complete Binary Tree (25 分)——完全二叉树,字符串转数字
Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...
- 在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端
在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端 在服务器端启动jupyter notebook服务,在 ...
- mac修改本机mysql的root密码
今天同事的MAC上的mysql的登陆密码忘记了,问我是否能解决,呵呵 我查了下 并做个记录 1. 在系统偏好设置中关闭 mysql : Stop MySQL Server 2.打开终端 进入 ...
- Multiple “order by” in LINQ(转载)
问: I have two tables, movies and categories, and I get an ordered list by categoryID first and then ...