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再将排序知识点熟悉一遍. ...
随机推荐
- 使用intellij idea搭建spring-springmvc-mybatis整合框架环境
使用intellij idea搭建spring-springmvc-mybatis整合框架环境 1.打开idea,创建maven项目,File-New-Project 2.选择Maven,勾选Cr ...
- IDEA多线程下多个线程切换断点运行调试的技巧
多线程调试设置可以参考:http://www.cnblogs.com/leodaxin/p/7710630.html 1 断点设置如图: 2 测试代码,然后进行debug package com.da ...
- canvas的drawImage函数
HTML5中引入新的元素canvas,其drawImage 方法允许在 canvas 中插入其他图像( img 和 canvas 元素) .drawImage函数有三种函数原型: drawImage( ...
- mysql数据类型介绍(含text,longtext,mediumtext说明)
转自http://m.blog.csdn.net/sipsir/article/details/12343581 转载,文章原连接已经失效,百度快照找到的. MySQL支持大量的列类型,它可以被分为3 ...
- 在 Linux 上安装 Oracle 数据库 11g
http://www.oracle.com/ocom/groups/public/@otn/documents/webcontent/229016_zhs.htm
- webpack4升级extract-text-webpack-plugin和UglifyJsPlugin问题
webpack4升级extract-text-webpack-plugin和UglifyJsPlugin问题 1. 使用了extract-text-webpack-plugin插件后,编译出错,代码 ...
- php使用MPDF导出PDF文件自定义字体
最近公司要生成一个PDF文件,网上找了很多类库,使用mpdf最方便,通过HTML输入调整样式,官方地址:http://www.mpdf1.com/,更改字体这个问题困扰了我很久,网上找的方法都不适用, ...
- AI 数值计算
数值计算,通过迭代来更新解的估计值. 1.上溢和下溢 实数按照一定的精度存储在计算机中,通常存在误差,进而可能导致一些错误. 1)下溢(underflow),例如接近0的数 2)上溢(overflow ...
- node通过http.request向其他服务器上传文件
function upload(callback) { let boundaryKey = '----' + new Date().getTime(); // 用于标识请求数据段 let option ...
- IntelliJ IDEA 常用设置 (二)
一. 代码提示和补充功能有一个特性:区分大小写. 区分大小写的情况是这样的:比如我们在 Java 代码文件中输入 stringBuffer IntelliJ IDEA 是不会帮我们提示或是代码补充的, ...