冒泡排序
冒泡排序的实现思路是比较任何两个相邻的项, 如果前者比后者大, 则将它们互换位置.
先生成一个指定长度的随机数组
function generatarAry (num = 10) {
let arr = []
for (let i = 0; i < num; i++) {
let item = ~~(Math.random() * (num + 1))
arr.push(item)
}
return arr
}
冒泡算法性能较差,事件复杂度为O(n*2)
function bubbleSort (ary = []) {
for (let i = 0; i < ary.length - 1; i++) {
for (let j = 0; j < ary.length - 1 - i; j++) {
if (ary[j] > ary[j + 1]) [ary[j], ary[j + 1]] = [ary[j + 1], ary[j]]
}
}
return ary
}
快速排序
快速排序采用分治法思想,将数组进行划分。时间复杂度为O(nlog^n)
function quickSort (ary = []) {
if (ary.length < 2) return
let l = [], r = [], m = ~~(ary.length / 2) // 新建两个空数组,分别存放小于中间数和大于中间数的数据
const mid = ary.splice(m, 1)[0]
for (let i = 0; i < ary.length; i++) {
ary[i] < mid ? l.push(ary[i]) : r.push(ary[i])
}
return quickSort(l).concat([mid], quickSort(r)) // 不断缩减区间,分别排序左右两个区间内的数据
}
选择排序
选择排序的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二个最小值并将其放到第二位,依次类推.
function selectSort (ary = []) {
let minIdx = 0
for (let i = 0; i < ary.length - 1; i++) {
minIdx = i
for (let j = i; j < ary.length; j++) { // 外层循环会找到最小值并替换到前面,所以内层循环从i开始即可
if (ary[minIdx] > ary[j]) minIdx = j // 找到更小的值更新最小值下标
}
if (minIdx !== i) [ary[i], ary[minIdx]] = [ary[minIdx], ary[i]] // 替换
}
return ary
}
插入排序
插入排序 的思路是每次排一个数组项,假定第一项已经排序,接着它和第二项比较, 决定第二项的位置, 然后接着用同样的方式决定第三项的位置, 依次类推, 最终将整个数组从小到大依次排序.
function insertSort (ary = []) {
let j, temp
for (let i = 0; i < ary.length; i++) {
j = i, temp = ary[i]
while (j > 0 && ary[j - 1] > temp) {
ary[j] = ary[j - 1]
j-- // 缩减下标,比较相邻的数是否大于temp
}
ary[j] = temp // 放到相应的位置
}
return ary
}
结语
写的不好,各位大佬多多指教,感恩家人🙏