0~n
之间的整数进行排序var testArr = [3, 5, 3, 5, 9, 7, 6]
console.log('原数组:', arr)
function skipSort (n, skipArr) {
let arr = []
let sortArr = []
arr.length = n
for (let i = 0; i <= n; i++) {
arr[i] = 0
}
for (let j = 0; j < skipArr.length; j++) {
arr[skipArr[j]]++
}
for (let t = 0; t <= n; t++) {
if (arr[t]) {
for (let k = 1; k <= arr[t]; k++) {
sortArr.push(t)
}
}
}
return sortArr
}
console.log('桶排序:', skipSort(10, testArr))
复制代码
var arr = [3, 5, 3, 5, 9, 7, 6]
console.log('原数组:', arr)
function bubbleSort (arr) {
let len = arr.length
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
return arr
}
console.log('冒泡排序:',bubbleSort(arr))
复制代码
chrome
使用快速排序的一个变体做为Array.prototype.sort的实现划分操做
。切记
:必定要先从右往左找,再从左往右找,不然会出错var arr = [3, 5, 3, 5, 9, 7, 6]
console.log('原数组:', arr)
function quickSort (arr, left, right) {
let len = arr.length
left = typeof left === 'undefined' ? 0 : left
right = typeof right === 'undefined' ? len - 1 : right
if (left > right) {
return
}
let temp = arr[left]
let i = left
let j = right
let t
while (i !== j) {
while (arr[j] >= temp && i < j) {
j--
}
while (arr[i] <= temp && i < j) {
i++
}
if (i < j) {
t = arr[i]
arr[i] = arr[j]
arr[j] = t
}
}
arr[left] = arr[i]
arr[i] = temp
quickSort(arr, left, i - 1)
quickSort(arr, i + 1, right)
return arr
}
console.log('快速排序:',quickSort(arr))
复制代码
var arr = [3, 5, 3, 5, 9, 7, 6]
console.log('原数组:', arr)
function selectSort (arr) {
let len = arr.length
let minIndex
let temp
for (let i = 0; i < len; i++) {
minIndex = i
temp = arr[i]
for (let j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
console.log('选择排序:',selectSort(arr))
复制代码
var arr = [3, 5, 3, 5, 9, 7, 6]
console.log('原数组:', arr)
function insertSort (arr) {
let len = arr.length
let preIndex
for (let i = 1; i < len; i++) {
preIndex = i - 1
current = arr[i]
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
arr[preIndex + 1] = current
}
return arr
}
console.log('插入排序:', insertSort(arr))
复制代码
Mozilla Firefox
使用归并排序做为Array.prototype.sort的实现归并排序
是一种分治算法。本质上就是把一个原始数组切分红较小的数组,直到每一个小数组只有一个位置,接着把小数组归并成较大的数组,在归并过程当中也会完成排序,直到最后只有一个排序完毕的大数组分治算法
的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可获得原问题的解。var arr = [3, 5, 3, 5, 9, 7, 6]
console.log('原数组:', arr)
function mergeSort (arr) {
let len = arr.length
if (len < 2) {
return arr
}
let middle = Math.floor(len / 2)
let left = arr.slice(0, middle)
let right = arr.slice(middle)
return merge(mergeSort(left), mergeSort(right))
}
function merge (left, right) {
let result = []
while (left.length && right.length) {
if (left[0] < right[0]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
result.push(...left)
result.push(...right)
return result
}
console.log('归并排序:', mergeSort(arr))
复制代码
堆排序其实是利用堆的性质
来进行排序的,咱们一般说的堆就是二叉堆
,二叉堆又称彻底二叉树
或者近似彻底二叉树
。堆排序是选择排序的一种
。能够利用数组的特色快速定位指定索引的元素。数组能够根据索引直接获取元素,时间复杂度为O(1)算法
最大堆的特性以下:chrome
最小堆的特性以下:api
算法思想数组
将待排序序列构形成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。而后将剩余n-1个元素从新构形成一个堆,这样会获得n个元素的次小值。如此反复执行,便能获得一个有序序列了。性能
const arr = [21, 34, 56, 2, 4, 9, 87]
console.log('原数组:', arr)
let len = arr.length
// 构建最大堆
function buildMaxHeap (arr) {
let mid = Math.floor(len / 2)
for (let i = mid; i >= 0; i--) {
heapify(arr, i)
}
}
// 子数的调整
function heapify (arr, i) {
let maxIndex = i
let left = 2 * i + 1
let right = 2 * i + 2
if (left <len && arr[maxIndex] < arr[left]) {
maxIndex = left
}
if (right <len && arr[maxIndex] < arr[right]) {
maxIndex = right
}
if (maxIndex !== i) {
swap(arr, i, maxIndex)
heapify(arr, maxIndex)
}
}
// 交换两值
function swap (arr, i, j) {
[arr[i], arr[j]] = [arr[j], arr[i]]
}
// 堆排序
function heapSort (arr) {
buildMaxHeap(arr)
for (let i = arr.length - 1; i>=0; i--) {
swap(arr, 0, i)
len--
heapify(arr, 0)
}
return arr
}
console.log('堆排序:', heapSort(arr))
复制代码