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再将排序知识点熟悉一遍. ...
随机推荐
- [Jsoi2015]染色问题
题目 看到这个限制条件有点多,我们就一直容斥好了 先容斥颜色,我们枚举至少不用\(i\)种颜色 再容斥列,我们枚举至少不用\(j\)列 最后容斥行,枚举至少不用\(k\)行 容斥系数显然是\((-1) ...
- 「JoyOI1080」N皇后
这是菜鸡的我第一次写这类题目: 题意:就是在N*N的棋盘上,每一行,每一列,所有的对角线都只能有一个棋子. 先分析:假若N=4: 则为其中的一种答案.要输出左右的解,肯定要枚举出所有的解.那么非常自然 ...
- Android集成讯飞语音、百度语音、阿里语音识别
项目实践:https://blog.csdn.net/Jsagacity/article/details/80094164 demo下载地址:https://fir.im/jy28 demo源码:ht ...
- go标准库的学习-crypto/md5
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...
- WaitForSingleObject的详细用法
在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObj ...
- JavaScript模块化思想
1. 首先,我们需要明白为什么要用模块化? 功能都是为了解决需求的.模块化可以带来的优点有以下几点: (1)可维护性.举个例子,如果我们把未使用模块化的代码比作油和水混合在了一起,模块化之后的代码就好 ...
- ftrace利器之trace-cmd和kernelshark
关键词:ftrace.trace-cmd.kernelshark. trace-cmd是设置读取ftrace的命令行工具,kernelshark既可以记录数据,也可以图形化分析结果. trace-cm ...
- IntelliJ IDEA 常用设置 (二)
一. 代码提示和补充功能有一个特性:区分大小写. 区分大小写的情况是这样的:比如我们在 Java 代码文件中输入 stringBuffer IntelliJ IDEA 是不会帮我们提示或是代码补充的, ...
- LiveCharts文档-4基本绘图-1基本线条图
原文:LiveCharts文档-4基本绘图-1基本线条图 4基本绘图-1基本线条图 using System; using System.Windows.Forms; using System.Win ...
- C#基础巩固(2)-Linq To XML创建XML
一.首先要清楚一个正确的XML基本格式是怎样的. 1.后缀名.xml结尾 2.有一行描述 3.有且仅有一个根节点. 如图: 一个正确的xml文件能够被浏览器打开且显示.所以判断一个xml文件有没有错误 ...