1.选择排序思路
- 从数组的第一个开始,将第一个元素和其他元素进行比较,在检查完所有元素后,最小的元素会放在数组的第一个位置。
- 然后算法从第二个位置继续。
2.选择排序基本实现
const arr = [8,0,4,6,1,2,7,3,5,9]
function choose (arr) {
// 最小元素的坐标
let minIndex
const len = arr.length
for (let i = 0; i < len; i++) {
minIndex = i
// 遍历查找,如果存在更小元素,则替换最小元素坐标
for (let j = i+1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
// 找到了最小坐标,替换到乱序数组头部
let middle = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = middle
}
return arr
}
console.log(choose(arr)) // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
- 最小值下标:minIndex=i,确定每次循环的最小值下标
- j=i+1,循环比较i坐标后的值,如果存在arr[j]<arr[minIndex],minIndex = j
- [arr[i],arr[minIndex]] = [arr[minIndex],arr[i]],调换i下标和minIndex下标的值。
- 每一个i都确定了一个最小值,如第一轮i=0时确定了一个最小0,i=1是确定了一个最小1,前面确定的后面不能影响。
规律:
i=0,确定一个最小值,由于是升序,所以最小值的位置肯定在0,所以arr[0]与arr[minIndex]调换
i=1,确定一个最小值,由于是升序,所在最小值的文字肯定在1,所以arr[1]与arr[minIndex]调换
…
3.选择排序算法优化
const arr = [8,0,4,6,1,2,7,3,5,9];
function choose (arr) {
// 左指针,从左到右开始遍历
let left = 0;
// 右指针,从右到左开始遍历
let right = arr.length - 1;
// 最大值
let max;
// 最小值
let min;
// 数组值不止一个
while (left < right) {
max = left;
min = left;
for(let i = left + 1;i < arr.length - left; i++){
// 同时寻找最小值和最大值坐标
if(arr[i] > arr[max]){
max = i;
}
if(arr[i] < arr[min]){
min = i;
}
}
// 如果找到的最大值不是末尾元素,则将最大值交换到末尾
if(max !== right){
[arr[max],arr[right]] = [arr[right],arr[max]]
}
if(min === right){
min = max;
}
// 如果找到的最小值不是头部元素,则将最大值交换到头部
if(min !== left){
[arr[min],arr[left]] = [arr[left],arr[min]]
}
left++;
right--;
}
return arr
}
console.log(choose(arr))
第一轮:
- left =0=min=max
- i =left +1,arr[1-8]<arr[arr[max=0]]arr[i=9]>arr[max=0],max = i =9
- i =left +1,arr[i=1] < arr[min = 0],min =i=1 /// min=1 != left=0,调换arr[0]与arr[1]