冒泡排序
重复比较相邻的两个项。
编码:
const betterBubbleSort = (arr) => {
for(let i = 0; i < arr.length; i++){
for(let j = 0; j < arr.length - 1 - i; i++){
if(arr[j] > arr[j + 1]){
[arr[j], arr[j+1]] = [arr[j+1],arr[j]];
}
}
}
return arr;
}
冒泡改进版:
const betterBubbleSort = (arr) => {
for(let i = 0; i < arr.length; i++){
let flag = false;
for(let j = 0; j < arr.length - 1 - i; i++){
if(arr[j] > arr[j + 1]){
[arr[j], arr[j+1]] = [arr[j+1],arr[j]];
//如果未产生交换说明该数组有序
flag = true;
}
}
// 如果是有序则返回
if(flag) return arr;
}
return arr;
}
规则:
在第一次冒泡的时候就定位到数组是否完全有序,省掉不必要的判断逻辑,时间复杂度定向优化为 O(n)。
选择排序
每次都找出当前范围内的最小值,把它放在当前范围的头部;然后缩小排序范围,继续重复以上操作,直至数组完全有序为止。
编码:
const selectSort = (arr) => {
for(let i = 0; i < arr.length; i++){
for(let j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
[arr[i], arr[arr[j]] = [arr[j], arr[i]]
}
}
}
return arr;
}
规则:
优化:另可使用变量存储最小索引值,判断最小索引与当前索引是否相等,不相等则交换,减少交换操作的性能消耗。
插入排序
选择后面的元素插入到前面并保证有序。
编码:
const insertSort = (arr) => {
//i从1开始,默认单个数为有序,如[5]
for(let i = 1; i < arr.length; i++){
let j = i;
let temp = arr[i];
while(j > 0 && arr[j-1] > temp){
// 前一位数比当前temp值大时,向后挪动位置
arr[j] = arr[j-1];
j--;
}
// 把temp插入有序位置
arr[j] = temp;
}
return arr;
}
规则:
基于当前元素前面的序列是有序的这个前提,从后往前去寻找当前元素在前面那个序列里的正确位置。