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再将排序知识点熟悉一遍. ...
随机推荐
- 2018-2019-2 网络对抗技术 20165318 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165318 Exp3 免杀原理与实践 免杀原理及基础问题回答 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil- ...
- NET Framework 各版本官方下载
https://msdn.microsoft.com/en-us/library/5a4x27ek(v=vs.110).aspx https://www.microsoft.com/zh-CN/dow ...
- Arduino IDE for ESP8266 项目云盒子(3)外网访问
互联网访问esp8266 https://item.taobao.com/item.htm?spm=a230r.1.14.20.eYblO3&id=521945102409&ns=1& ...
- 0 ardunio processing 显示三轴数据
http://blog.csdn.net/Fortware/article/details/38307799 /** * Mixture * by Simon Greenwold. * * Displ ...
- mysql数据类型介绍(含text,longtext,mediumtext说明)
转自http://m.blog.csdn.net/sipsir/article/details/12343581 转载,文章原连接已经失效,百度快照找到的. MySQL支持大量的列类型,它可以被分为3 ...
- AWS 为 Elasticsearch 推出开源发行版
WS 近日宣布为 Elasticsearch 推出开源发行版 Open Distro for Elasticsearch. Elasticsearch 是一个分布式.面向文档的搜索和分析引擎,它支持结 ...
- POST提交数据之---Content-Type的理解;
POST提交数据之---Content-Type的理解: Content-Type是指http/https发送信息至服务器时的内容编码类型,contentType用于表明发送数据流的类型,服务器根据编 ...
- protobuf可变长编码的实现原理
protobuf中的整数,如int32.int64.uint32.uint64.sint32.sint64.bool和enum,采用可变长编码,即varints. 这样做的好处是,可以节省空间.根据整 ...
- Android学习之基础知识十四 — Android特色开发之基于位置的服务
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
- Spark笔记-DataSet,DataFrame
DataSet:面向对象的,从JVM进行构建,或从其它格式进行转化 DataFrame:面向SQL查询,从多种数据源进行构建,或从其它格式进行转化 RDD DataSet DataFrame互转 1. ...