// 插入排序
// 扑克牌 从后 插入 找到第一个比他小的后面 插入
// 不要用 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]
浅析排序算法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1、冒泡排序 冒泡排序的思想是,使用 n个 for循环重复遍历数组。每次 for循环从数组的第一个数开始逐个往后两...
- 总的来说排序性能:希尔排序算法>插入排序>选择排序>冒泡排序 希尔排序算法代码 冒泡排序算法代码 选择排序 插入排...