选择排序:顾名思义选择,选择排序属于O(N^2)的排序算法,意思就是选择数组中的最小的拿出来放在第一位,然后再剩下的数里面,选择最小的,排在第二位,以此类推。
例如:8 3 4 5 6 2 1 7
第一次:寻找数组中最小的数1,然后和8替换,得到 1 3 4 5 6 2 8 7
第二次:因为1的位置已经确定,所以只需要找剩下数组中最小的就行了,2和3互换得到1 2 4 5 6 3 8 7
第三次:1和2的位置已经确定,就看剩下的数中最小的数,3和4互换,结果是1 2 3 5 6 4 8 7
.........就这样以此类推直到正确的结果为止1 2 3 4 5 6 7 8 ,代码如下
1 var arr = [8,3,4,5,6,2,1,7];
2
3 function exchange(array, r1, r2){
4 var temp = array[r1];
5 array[r1] = array[r2];
6 array[r2] = temp;
7 }
8
9 function selectionSort(arr){
10 for(let i = 0;i < arr.length;i++){
11 var minIndex = i;
12 for(let j = i + 1; j < arr.length; j++){
13 if(arr[j] < arr[minIndex]){
14 minIndex = j;
15 }
16 }
17 exchange(arr, i, minIndex);
18 }
19 return arr;
20 }
21
22 console.log(selectionSort(arr));
exchange互换函数,因为js语言中没有c++语言swap()函数实现值的互换,需要自定义函数来实现。selectionSort()函数的逻辑是两层for循环,把最小值的索引放在minIndex中。[8,3,4,5,6,2,1,7]
比如我们声明的数组第一次先把arr[minIndex]作为最小值,因为是第一次循环i=0;所以arr[0]当作最小值,接下来从(i+1)的索引开始判断,因为3<8,所以minIndex变为1,arr[minIndex]=arr[1]=3,又因为4>3,什么也不做,接着5>3,6>3,不作为。碰到2的时候,2<3,所以2的索引赋值给minIndex,此时minIndex=5,1的时候1<arr[5],1的索引值复制给minIndex,这个时候minIndex=6,由于7大于1,不作为。第一轮的循环,minIndex=6。执行exchange函数,8和1互换位置。就这样循环下去即可。
刚才又用一下es6的变量的解构赋值,亲测有效。