选择排序:顾名思义选择,选择排序属于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的变量的解构赋值,亲测有效。

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!