feat: 添加选择排序
This commit is contained in:
parent
167bb9f481
commit
e304e7378a
69
sort/select-sort.mjs
Normal file
69
sort/select-sort.mjs
Normal file
@ -0,0 +1,69 @@
|
||||
import { generateRandomArray, isSort, swap } from "../util/index.mjs"
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {number[]} arr
|
||||
* @description 朴素的冒泡排序
|
||||
*/
|
||||
export function selectSort(arr) {
|
||||
let len = arr.length
|
||||
for(let i = 0; i< len; i++) {
|
||||
let minIndex = i
|
||||
for(let j = i+1; j < len; j++) { // 找到本轮最小的值
|
||||
if(arr[j] < arr[minIndex]) {
|
||||
minIndex = j
|
||||
}
|
||||
}
|
||||
swap(arr, i, minIndex); // 交换最小值和选择值的下标
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {number[]} arr
|
||||
* @description 两端同时排序,类似鸡尾酒排序
|
||||
*/
|
||||
function selectSort2(arr) {
|
||||
let left = 0;
|
||||
let right = arr.length - 1;
|
||||
|
||||
while (left < right) {
|
||||
let minIndex = left;
|
||||
let maxIndex = right;
|
||||
|
||||
for (let i = left; i <= right; i++) {
|
||||
// 寻找最小值的索引
|
||||
if (arr[i] < arr[minIndex]) {
|
||||
minIndex = i;
|
||||
}
|
||||
// 寻找最大值的索引
|
||||
if (arr[i] > arr[maxIndex]) {
|
||||
maxIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
// 将最小值交换到左边
|
||||
[arr[left], arr[minIndex]] = [arr[minIndex], arr[left]];
|
||||
// 如果最大值的索引是左边的索引,由于上一步交换,所以更新为最小值的索引
|
||||
if (maxIndex === left) {
|
||||
maxIndex = minIndex;
|
||||
}
|
||||
// 将最大值交换到右边
|
||||
[arr[right], arr[maxIndex]] = [arr[maxIndex], arr[right]];
|
||||
|
||||
// 更新左右指针
|
||||
left++;
|
||||
right--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
let arr = generateRandomArray(10)
|
||||
console.log(arr);
|
||||
selectSort2(arr)
|
||||
console.log(isSort(arr));
|
||||
console.log(arr);
|
||||
|
||||
// 实际比较下来优化后的选择排序也没太大作用(实际开发不应使用这种排序,主要学习其解决思路)
|
Loading…
x
Reference in New Issue
Block a user