选择排序的实现
const arr = [4, 1, 6, 9, 3, 2, 8, 7];
/**
* 比较两个数
* @param {Number} first 第一个数
* @param {Number} second 第二个数
* @returns boolean
*/
function compare(first, second) {
if (first >= second) return true;
else return false;
}
/**
* 交换两个数的位置
* @param {Array} arr 数组
* @param {Number} first 第一个数的索引值
* @param {Number} second 第二个数的索引值
*/
function exchange(arr, first, second) {
let temp = arr[first];
arr[first] = arr[second];
arr[second] = temp;
}
/**
* 选择排序
* @param {Array} arr 数据
*/
function scort(arr) {
for (let i = 0; i < arr.length; i++) {
let maxIndex = 0;
for (let j = 0; j < arr.length - i; j++) {
if (compare(arr[maxIndex], arr[j])) {
maxIndex = j
}
}
console.log(arr.length)
exchange(arr, maxIndex, arr.length - i - 1)
}
}
scort(arr)
console.log(arr)
从上面代码可以看出,与冒泡排序差不多,但是与冒泡排序是有很大的差别的
选择排序的逻辑
function scort(arr) {
for (let i = 0; i < arr.length; i++) {
let maxIndex = 0;
for (let j = 0; j < arr.length - i; j++) {
if (compare(arr[maxIndex], arr[j])) {
maxIndex = j // 此时与冒泡排序的区别,冒泡排序是直接交换,但是选择排序是将该索引值保存下来,
}
}
console.log(arr.length)
exchange(arr, maxIndex, arr.length - i - 1) // 到第二层循环结束后才会进行交换
}
}
而冒泡排序的逻辑是
/**
* 冒泡排序
* @param {Array} arr 需要排序的数组
*/
function sort(arr) {
for (let j = 0; j < arr.length; j++) {
// 当前排序方式一大小排序,第一次循环中最大值会被换到最后,第一次就找到最大值,第二循环会找到第二大的值,依次往后
for (let i = 0; i < arr.length - 1 - j ; i++) {
if (compare(arr[i], arr[i + 1])) {
exchange(arr, i, i + 1) // 此时是直接进行交换,选择排序,会将值保存下来
}
}
}
}