选择排序的原理
- 暂且认为集合中第一个元素是最小的,记录最小元素的下标为第一个元素的下标,然后依次和右边的元素作比较,如果比记录元素小,那么就更新下标为该元素的下标,反之不变;遍历结束后就把第一个元素和最小下标值的元素交换位置;然后再第二个元素、第三个元素。。。依次执行上面的操作,直到把所有的元素查找一遍.
代码实现
初始版本代码
function sectionFun(arr){
let tempArr = arr.slice()
for(let j = 0
let minIndex = j
for(let i = j
if(tempArr[i] < tempArr[minIndex]){
minIndex = i
}
}
// 交换位置
changeFun(tempArr, j, minIndex)
}
}
// 交换函数
function changeFun(arr, i, j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
优化版本
- 构想: 每次都找到最小的和最大的,小的放左边,大的放右边
function sectionFun(arr){
let tempArr = arr.slice()
/*
Math.ceil((tempArr.length - 1) / 2)
因为是每次是找出最大的和最小的,所以遍历次数最多是长度的一般,为了保证准确性,向上取整
*/
for(let j = 0
let minIndex = j
let maxIndex = tempArr.length - 1 - j
let lastIndex = tempArr.length - 1 - j
for(let i = j
if(tempArr[i] < tempArr[minIndex]){
minIndex = i
}
if(tempArr[i] > tempArr[maxIndex]){
maxIndex = i
}
}
/*
如果获取到的最大的位置为最小位置需要交换的下标,所以需要更换交换后的下标,否则会有问题,因为刚更换的最小值又被更换到了最大值那边了 比如 9和2
ps: 1, 9, 7, 4, 2, 8, 5, 3, 6, 10
*/
if (maxIndex == j) {
maxIndex = minIndex
}
// 把大小的元素放到它该有的位置
changeFuc(arr, j, minIndex)
changeFuc(arr, lastIndex, maxIndex)
}
}
// 交换函数
function changeFun(arr, i, j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
算法效率
- 时间复杂度: O(n), 最坏情况下仍为O(n^2)
- 控件复杂度: O(1)