选择排序

选择排序的思路:从数组的起始位置,通过比较数值间的大小,找到最终数值对应得索引下标,在将此索引下标得数值与相比较得数值进行交换。
从数组起始位置开始,找到最小数值得索引下标,并与起始位置交换数值,之后进行下一次循环,之前得起始位置将不在参与循环。
以数组[3,5,2,4,1]为例说明一下,

我们定义外层循环次数为j,内部循环次数为i;我们知道数组的索引下标都是从0开始的,所以我们将j与i的初始值也定为0,从0 取值也是为了方便数组内部从arr[0]开始取值进行比较。

我们先定义数组的最小值的索引下标为min,并当首次循环时候,假设数组的第一个数值是最小值,及min=0,再依次与后面的数值进行比较大小

j=0 外层的循环第一次循环:

起使数组:[3,5,2,4,1]
经比较,3>2,此时将2位置的索引号赋值给min,在用2与后面的数值继续比较,最终找到1数值是小的,将1对应的索引号赋值给min,找到最小的数值之后将此数值和数组的第一个数值进行交换位置,此时数组变为[1,5,2,4,3]]

j=1 外层的循环第二次循环:

起使数组:[1,5,2,4,3] ----->也就是上一次外部循环结束后的数组
此时数组第一个数1没有必要在执行程序与其他数值进行比较了,可以直接从第二个数值开始,也就是说索引下标min可以不用从0开始,从索引下标为1数值为5开始,经比较5>2,此时将2位置的索引下标赋值给min,在继续比较,发现没有比2大的了,此时将2与5数值上交换位置,数组变为1,2,5,4,3

j=2 外层的循环第三次循环:

起使数组:[1,2,5,4,3] ----->也就是上一次外部循环结束后的数组
此时数组第一个数1,第二个数值2 没有必要在执行程序与其他数值进行比较了,可以直接从第三个数值开始,也就是说索引下标min可以不用从0和1开始,直接索引下标为2数值为5开始,经比较5>4,此时将4位置的索引下标赋值给min,在继续比较4>3,此时将3位置的索引下标赋值给min,再将3与5数值上交换位置,数组变为[1,2,3,4,5]

j=3外层的循环第四次循环:

起使数组:[1,2,3,4,5] ----->也就是上一次外部循环结束后的数组
此时数组第一个数1,第二个数值2 第三个数值3 没有必要在执行程序与其他数值进行比较了,可以直接从第四个数值开始,也就是说索引下标min可以不用从0和1 和2开始,直接索引下标为3数值为4开始,经比较4<5,不需要调换位置了,程序执行完毕。【如果比较需要调换位置的话再进行位置调换程序就执行完毕了】

经以上分析,已经确定出来的最小值不需要再进行比较了,那么每次外层循环时,里面的min的取值可以不必从0开始,其取值可与外层循环j保持相同。

        // 外层循环,循环次数,次数是单元个数 -1
        for(var j = 0 ; j <= arr.length-1 -1 ; j++){
            // 先默认起始位置就是最小值位置,存储起始位置的索引,也就是 j
            // 之前的起始位置,不参与下一次循环
            var min = j;
            // 默认的最小值位置是当前循环的起始位置j
            // 比较,要从下一个位置开始,内层循环起始,是比较的起始位置+1开始循环 
            for(var i = j+1 ; i <= arr.length-1 ; i++){
                //比较数值的大小
                if(arr[min] > arr[i]){
                    // 将数值小的索引下标赋值给min再进行下面的程序
                    min = i;
                }
            }
            // 内层循环执行完毕后若存储的索引下标不是起始的索引j
            // 就交换 min中存储的索引下标对应的数值 和 j索引下标应的数值
            if(min != j){
                var m = 0;
                m = arr[j];
                arr[j] = arr[min];
                arr[min] = m;
            }
        }
console.log(arr);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值