注:所有排序规则默认都是从小到大
交换数组元素的公共方法:
function swap(array, i, j) {
let temp = array[i]
array[i] = array[j]
array[j] = temp
}
选择排序
概念
将数组中的每个元素从左到右依次和后面的元素作对比,将后面元素中最小值和该元素进行交换
图示
实现
// 选择排序
function selectionSort(array) {
const len = array.length
// 循环列表,和后面的元素对比,这里len可以写成len - 1
// 因为len - 1是最后一个元素的索引,i == len - 1时内层循环执行无意义
for (let i = 0; i < len; i++) {
// 定义最小值的索引,默认为i
let minIndex = i
for (let j = i; j < len; j++) {
// 比较
if (array[j] < array[minIndex]) {
// 更新最小值索引
minIndex = j
}
}
// 交换元素
let temp = array[i]
array[i] = array[minIndex]
array[minIndex] = temp
}
}
测试
const list = [4, 8, 3, 5, 3, 9, 1, 5, 4, 6]
selectionSort(list)
console.log(list) // [1, 3, 3, 4, 4, 5, 5, 6, 8, 9]
插入排序
概念
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置
图示
实现
// 插入排序
function insertionSort(array) {
// 数组首元素视为已排序
for (let i = 1; i < array.length; i++) {
// j > 0保证前一个元素索引j - 1不越界
for (let j = i; j > 0; j--) {
// 和前一个元素做比较,大于则交换
if (array[j] < array[j - 1]) {
// 交换元素
let temp = array[j]
array[j] = array[j - 1]
array[j - 1] = temp
} else {
break
}
}
}
}
测试
const list = [4, 8, 3, 5, 3, 9, 1, 5, 4, 6]
insertionSort(list)
console.log(list) // [1, 3, 3, 4, 4, 5, 5, 6, 8, 9]