js排序方法

本文详细介绍了多种排序算法的实现,包括选择排序、冒泡排序、归并排序、快速排序及堆排序,并提供了完整的JavaScript代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(0).map(_ => Math.random() * n | 0)

}

//选择排序( 不稳定):
function selectSort(ary) {
    for (var i = 0; i < ary.length - 1; i++) {
        let min = i
        let change
        for (var j = i + 1; 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 - 1; i >= 0; i--) {
        flag = false
        for (let j = 0; j < i; j++) {
            //if (ary[j + 1] < ary[j]) {
            if (comparator(ary[j], ary[j + 1]) > 0) {
                flag = true
                swap(ary, j, j + 1)
            }
        }
        if (!flag) {
            break
        }
    }
    return ary
}

function comparator(a, b) {
    if (a > b) {
        return 1
    } else {
        return -1
    }
}

//归并排序 稳定的
function mergeSort(ary) {
    if (ary.length < 2) {
        return ary.slice()
    }

    var mid = Math.floor(ary.length / 2)
    var left = mergeSort(ary.slice(0, mid))
    var right = mergeSort(ary.slice(mid))
    var result = []

    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift())
        } else {
            result.push(right.shift())
        }
    }

    result.push(...left, ...right)

    return result
}



//快速排序:
function partition(ary, comparator, start = 0, end = ary.length - 1, ) {
    if (start >= end) {
        return
    }

    var pivotIndex = Math.floor(Math.random() * (end - start + 1) + start)
    var pivot = ary[pivotIndex]

    swap(ary, pivotIndex, end)

    for (var i = start - 1, j = start; j < end; j++) {
        if (comparator(ary[j], pivot) < 0) {
            i++
            swap(ary, i, j)
        }
    }

    swap(ary, i + 1, end)
    partition(ary, comparator, start, i)
    partition(ary, comparator, i + 2, 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 - 1) {
    if (topIndex > endIndex) {
        return
    }

    var largestIndex = topIndex
    var leftIndex = topIndex * 2 + 1
    var rightIndex = topIndex * 2 + 2

    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
}



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 - 1) / 2 | 0
        if (parentPos >= 0 && this.comparator(this.heap[pos], this.heap[parentPos]) < 0) {
            this._swap(pos, parentPos)
            this._reverseReheap(parentPos)
        }
    }

    push(val) {
        this.heap.push(val)
        this._reverseReheap(this.heap.length - 1)
    }

    _reheap(topIndex, endIndex = this.heap.length - 1) {
        if (topIndex > endIndex) {
            return
        }

        var ary = this.heap

        var largestIndex = topIndex
        var leftIndex = topIndex * 2 + 1
        var rightIndex = topIndex * 2 + 2

        if (leftIndex <= endIndex && this.comparator(ary[leftIndex], ary[largestIndex]) < 0) {
            largestIndex = leftIndex
        }
        if (rightIndex <= endIndex && this.comparator(ary[rightIndex], ary[largestIndex]) < 0) {
            largestIndex = rightIndex
        }

        if (largestIndex != topIndex) {
            swap(ary, largestIndex, topIndex)
            this._reheap(largestIndex, endIndex)
        }

    }

    pop() {
        if (heap.length === 1) {
            return this.heap.pop()
        }
        var result = this.heap[0]
        this.heap[0] = this.heap.pop()
        this._reheap(0)
        return result
    }
}

请给你自己加油!

转载于:https://www.cnblogs.com/l8l8/p/8697847.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值