1.冒泡排序
冒泡排序是指两两进行对比,大的元素移到后面,俗称冒泡
思路:
第一次循环,两两对比,找出数组中最大的元素,放到数组的最后一位
第二次循环,找出第二大元素,放到数组的倒数第二位中,依次类推
function bubble(arr) {
for(let i = 0; i <arr.length; i++) {
for(let j = 0; j < arr.length-1-i; j++) {
if(arr[j] > arr[j+1]) { // 交换
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
}
tips:
2.选择排序
找出当前数组的最小元素,将其放在数组的前面,依次类推
function selection(arr) {
for(let i = 0; i < arr.length-1; i++) {
let minIndex = i
for(let j = i+1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) minIndex = j
}
// 知道当前未排序数组的最小项为minIndex
// 交换
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
}
}
3.插入排序
插入排序是将数组分成已排序和未排序部分,默认数组的第一个元素为已排序,依次取未排序的元素,与已排序的元素从右到左进行对比,如果已排序的元素大于未排序的元素,则已排序的元素向后移动一位,直到找到未排序的元素正确的位置为止
function insert(arr) {
for (let i = 1; i < arr.length; i++) {
// 当前需要排序的元素
const currentItem = arr[i]
// 遍历已排序部分
for (let j = i-1; j >= 0; j--) {
if (currentItem < arr[j]) {
// 已排序元素向后移动,为未排序元素腾出位置
arr[j+1] = arr[j]
} else { // 找到对应的位置
break
}
}
// 插入到对应的位置
arr[j+1] = currentItem
}
}
function insert(arr) {
for(let i = 1; i < arr.length; i++) { // 未排序数组
for(let j = i-1; j >= 0; j--) { // 已排序数组
if (arr[j+1] < arr[j]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
}
tips:javascript实现插入排序_xm2by的博客-CSDN博客
4.快速排序
取出数组的中间元素作为基数,遍历整个数组,比基数小的放在左边数组,比基数大的放在右边数组,一直处理到待遍历的数组长度为1为止,最后将左数组,基数,右数组合并
function quick(arr) {
if (arr.length <= 1) return arr
// 取基数
const middleIndex = Math.floor(arr.length/2), middleItem = arr.splice(middleIndex, 1)[0]
let leftArr = [], rightArr = []
for (let i = 0; i < arr.length; i++) {
const item = arr[i]
if (item > middleItem) {
rightArr.push(item)
} else {
leftArr.push(item)
}
}
return [...quick(leftArr), middleItem, ...quick(rightArr)]
}
tips:快速排序(Quicksort)的Javascript实现 - 阮一峰的网络日志
5.归并排序
归并采用分治算法,现将数组划分为最小的有序数组,然后将这些有序数组递归合并,最后形成一个有序数组。
tips:归并排序(js实现) - JS代码
6.计数排序
适用于给定范围值的数组,通过下标进行排序。创建额外的数组,将原数组的元素值作为额外数组的下标,而额外数组的元素值代表的下标在原数组出现的次数。
7.桶排序
获取数组的最小值和最大值,确定数组元素的范围,将范围划分成任意个数,就可以确定每个桶的数量及桶的范围,遍历数组,将元素放到对应的桶里。
对桶进行排序(任意排序算法,推荐插入排序)
对桶进行合并
tips:手写算法并记住它:桶排序 - 掘金
各大排序的复杂度