从上图可知,每次循环,找到数组中最小的那个元素,将它和数组要进行循环的第一个元素交换位置;交换后的数将不再进入下一次循环,比如上述2交换后,下次循环2将不再这次循环中;依此类推。(即初始时假设第一个值为最小值,和后面的值进行比对找出最小值)
双层for循环
- 外层for循环:
[0,len-1]
- 内层for循环:
- 假设第一个索引的值是最小的,从第二个开始比较,挨个查找,直到找到最小的索引值,然后交换,这样一次遍历就可以确定无序区间第一个位置上是最小的值
- 如果外层循环已经确定了2个,那就从第3个开始,所以遍历区间是
[i+1,len]
- 如果外层循环已经确定了2个,那就从第3个开始,所以遍历区间是
- 假设第一个索引的值是最小的,从第二个开始比较,挨个查找,直到找到最小的索引值,然后交换,这样一次遍历就可以确定无序区间第一个位置上是最小的值
综上所述,有如下代码
function swap(arr, i, j){
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//sort为true时是升序,否则为降序
function choiceSort(arr,sort){
let len = arr.length;
let minIndex = 0;
for(let i = 0;i< len-1;i++){
minIndex = i;
for(let j = i+1;j<len;j++){
let result = (sort ? arr[j] < arr[minIndex] : arr[j] > arr[minIndex]);
if(result){
minIndex = j;
}
}
if(minIndex !== i){
swap(arr,i,minIndex);
}
}
return arr;
}
console.log(choiceSort([4,3,5,3,1],true));
从上面逻辑我们得知时间复杂度都是O(n^2)。