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排序方法的更多相关文章

  1. 【js基础】js排序方法——快排+堆排+插排+选择排

    快排 Array.prototype.fastSort = function(){ var arr = this; function sort(left, right, arr){ if( left ...

  2. js 排序:sort()方法、冒泡排序、二分法排序。

    js中的排序,这里介绍三种,sort()方法.冒泡排序.二分法排序. 1.sort方法 写法:  数组.sort(); 返回排好序的数组,如果数组里是数字,则由小到大,如果是字符串,就按照第一个字符的 ...

  3. js中的数组对象排序(方法sort()详细介绍)

    定义和用法 sort() 方法用于对数组的元素进行排序. 语法    arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意 ...

  4. JS学习笔记(3)--json格式数据的添加,删除及排序方法

    这篇文章主要介绍了json格式数据的添加,删除及排序方法,结合实例形式分析了针对一维数组与二维数组的json格式数据进行增加.删除与排序的实现技巧,需要的朋友可以参考下   本文实例讲述了json格式 ...

  5. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {nam ...

  6. 各种排序方法的JS实现

    各种排序算法的对比总结如下表所示: 冒泡排序: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  7. js 几种排序方法

    1.冒泡排序 var arr = [9, 7, 5, 3, 1]; for (var i = 0; i < arr.length - 1; i++) { for (var j = 0; j &l ...

  8. js字符串排序方法

    前端开发过程中有时需自己手写排序方法 一般想到数字的字符串排序方法 我们会用到 var newArr = arr. sort(function(a,b){return a - b})来进行排序 但除此 ...

  9. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

随机推荐

  1. yii2 修改验证码小部件样式

    <?= $form->field($model, 'verifyCode',['labelOptions' => ['class' => 'yanzhengma','style ...

  2. shell编程之循环

    一.for循环 for循环是Shelll中最常见的循环结构,根据书写习惯又分为列表for循环.不带列表的for循环以及类C的for循环.for循环是一种运行前的测试语句,也就是在运行任何循环体之前先要 ...

  3. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 1: ordinal not in range(128)

    对于写python的人来说,这个异常一点不陌生,只要涉及到中文字符串的操作,一不小心就会出错.关于这个问题的解释,找到一篇好文,分享一下. 原文地址:https://blog.csdn.net/u01 ...

  4. glVertexAttribPointer 用法简介

    在内存中采用交叉模式存储,向gpu传入顶点数据的方法  GPU: #version 100 attribute highp vec2 aPosition; attribute highp vec2 a ...

  5. fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。

    为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...

  6. Vue 改变数组中对象的属性不重新渲染View的解决方案

    Vue 改变数组中对象的属性不重新渲染View的解决方案 在解决问题之前,我们先来了解下 vue响应性原理: Vue最显著的一个功能是响应系统-- 模型只是一个普通对象,修改对象则会更新视图.受到ja ...

  7. tiled卷积神经网络(tiled CNN)

    这个结构是10年Quoc V.Le等人提出的,这里的tiled,按照 Lecun的解释是Locally-connect non shared.即是局部连接,而且不是共享的,这是针对于权重来说的.本文翻 ...

  8. 方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)

    方差(variance).标准差(Standard Deviation).均方差.均方根值(RMS).均方误差(MSE).均方根误差(RMSE) 2017年10月08日 11:18:54 cqfdcw ...

  9. asp.net网站,在没有项目源码情况下的扩展

    如果在没有源码的情况下,要扩展asp.net网站,可以自己新增一个类库项目,在里面添加需要扩展的类,代码如下: using System; using System.Collections.Gener ...

  10. 【php增删改查实例】第十三节 - EasyUI列格式化

    因为easyUI的datagrid组件是横着一格一格加载数据的,一行加载好了之后才会去加载下一行.所谓的列格式化,就是在加载某一列的所有单元格时,对即将加载到这些单元格的数据进行二次包装. 比如,我们 ...