排序算法

// 插入排序

//  扑克牌  从后 插入 找到第一个比他小的后面 插入 
//  不要用 splice()  会导致整体的挪动




insertSort = arr => {
    if (arr.length <= 1) return arr
    for (let s = 1; s < arr.length; s++) {
        const n = arr[s] // 记住n
        let i // i要在for循环之后使用
        for (i = s - 1; i >= 0; i--) {
            //比 n 大的数字往后挪了一位
            if (arr[i] > n) arr[i + 1] = arr[i]
            // 遇到比 n 小的就中断循环
            else if (arr[i] <= n) break
        }
        arr[i + 1] = n
    }
    return arr
}



insertSort([3, 2, 1])
// [1, 2, 3]
insertSort([1, 1, 1])
// [1, 1, 1]



// 冒泡

//  第一个为初始值 当成最小值  与后面的值两两比较 涉及轮数 和 长度 当前index  关系
bubbleSort = arr => {
    const { length } = arr
    for (let r = 0; r < length - 1; r++) {
        for (let i = 0; i < length - r - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]
            }
        }
    }
    return arr
}


bubbleSort([3, 2, 1])
// [1, 2, 3]
bubbleSort([1, 1, 1])
// [1, 1, 1]


//   计数排序

// 用一个hash 将数组复制进来
//  按照出现值次数  进行计数
// 遍历1到max值 return 所有值  如果有重复值 展示多次
countSort = arr => {
    if (arr.length <= 1) return arr
    let hashTable = {} // 用于计数的对象
    let max = arr[0] // 用于记录最大值,假设第一个最大
    for (let i = 0; i < arr.length; i++) {
        const n = arr[i]
        hashTable[n] = hashTable[n] === undefined ? 1 : hashTable[n] + 1 // n 对应的 value 要么置为1,要么加1
        if (n > max) max = n // 更新最大值
    }
    const result = [] // 要返回的数组
    console.log('hashTable')
    console.log(hashTable)
    for (let k = 1; k <= max; k++) { // 正整数数组从1开始
        if (hashTable[k] !== undefined) { // hashTable[k] 表示数字出现的次数
            for (let m = 0; m < hashTable[k]; m++) {
                result.push(k) // 出现几次,就 push 几次
            }
        }
    }
    return result
}

countSort([3, 2, 1])
// [1, 2, 3]
countSort([1, 1, 1])
// [1, 1, 1]





// 选择排序
//  排序中 第一个值  当第一个值 为1  返回这个数组
// 当第一个值不为1  大于等于2 找数组中最小min的值 作为第一个值  对后面 n-1数组排序


selectSort = arr => {
    if (arr.length <= 1) return arr
    for (let i = 0; i < arr.length - 1; i++) { // 一共选择 length - 1 次,因为最后一次只有一个元素不用选
        let minIndex = i // 假设第一个是最小的
        for (let k = i + 1; k < arr.length; k++) {
            if (arr[k] < arr[i]) {
                minIndex = k // 第 k 个比第一个小,就用 minIndex 记住 k
            }
        }
        [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]] // 交换 arr[i] 和 arr[minIndex] 的值
    }
    return arr
}

selectSort([3, 2, 1])
// [1, 2, 3]
selectSort([1, 1, 1])
// [1, 1, 1]






推荐阅读更多精彩内容