|
| 1 | +/* |
| 2 | + * @Description: 最小的K个数 |
| 3 | + * @Version: Beta1.0 |
| 4 | + * @Author: 【B站&公众号】Rong姐姐好可爱 |
| 5 | + * @Date: 2021-04-28 23:12:33 |
| 6 | + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 |
| 7 | + * @LastEditTime: 2021-04-28 23:35:30 |
| 8 | + */ |
| 9 | + |
| 10 | +/** |
| 11 | + * 先排序,后截取(偷懒做法) |
| 12 | + * |
| 13 | + * @param input |
| 14 | + * @param k |
| 15 | + * @returns {*} |
| 16 | + */ |
| 17 | +function getLeastNumbersOne(input, k) { |
| 18 | + // 直接基于快排,最快速的拿到排序结果也行 |
| 19 | + return input.sort((a, b) => a - b).slice(0, k) |
| 20 | +} |
| 21 | + |
| 22 | +/** |
| 23 | + * 基于冒泡排序,跑K趟即可 |
| 24 | + * @param input |
| 25 | + * @param k |
| 26 | + * @returns {*[]|*} |
| 27 | + */ |
| 28 | +function getLeastNumbersTwo(input, k) { |
| 29 | + const len = input.length |
| 30 | + // 添加参数校验 |
| 31 | + if (k > len) { |
| 32 | + return [] |
| 33 | + } |
| 34 | + // 先将输入的数组进行排序从小到大 只排前面几个即可 |
| 35 | + // 这里首先想到的是冒泡或者插入排序里面的特性 --- 每次都有一个元素在最终的位置上 |
| 36 | + |
| 37 | + // 循环k次,跑k趟 |
| 38 | + for (let index = 0; index < k; index++) { |
| 39 | + // 从后往前找 |
| 40 | + for (let j = len - 1; j > index; j--) { |
| 41 | + if (input[index] > input[j]) { |
| 42 | + // 找到比它小的,位置交换 |
| 43 | + [input[index], input[j]] = [input[j], input[index]] |
| 44 | + } |
| 45 | + } |
| 46 | + } |
| 47 | + // 排序完毕,输入前k个 |
| 48 | + return input.slice(0, k) |
| 49 | +} |
| 50 | + |
| 51 | +/** |
| 52 | + * 基于选择排序 |
| 53 | + * @param input |
| 54 | + * @param k |
| 55 | + */ |
| 56 | +function getLeastNumbersThree(input, k) { |
| 57 | + const len = input.length |
| 58 | + for (let i = 0; i < k; i++) { |
| 59 | + // 从前往后找 |
| 60 | + for (let j = i; j < len; j++) { |
| 61 | + if (input[i] > input[j]) { |
| 62 | + // 位置互换,从小到大 |
| 63 | + [input[i], input[j]] = [input[j], input[i]] |
| 64 | + } |
| 65 | + } |
| 66 | + } |
| 67 | + |
| 68 | + // 找出前k个 |
| 69 | + return input.slice(0, k) |
| 70 | +} |
| 71 | + |
| 72 | + |
| 73 | +/** |
| 74 | + * 基于堆排序 |
| 75 | + * @param input |
| 76 | + * @param k |
| 77 | + */ |
| 78 | +function getLeastNumbersFour(input, k) { |
| 79 | + // todo 构建树 维护小根堆 |
| 80 | +} |
| 81 | + |
| 82 | + |
| 83 | +console.log(getLeastNumbersOne([4, 5, 1, 6, 2, 7, 3, 8], 4)) |
| 84 | +console.log(getLeastNumbersTwo([4, 5, 1, 6, 2, 7, 3, 8], 4)) |
| 85 | +console.log(getLeastNumbersThree([4, 5, 1, 6, 2, 7, 3, 8], 4)) |
0 commit comments