JavaScript实现选择排序及其优化

选择排序基本思想:每一趟从待排序的数据元素中选择最小(或最大)的元素作为首元素 直到所有元素排完为止。

名词解释:

时间复杂度:时间复杂度是指一个算法执行所耗费的时间
空间复杂度:是指运行完一个程序所需要内存的大小
稳定性:如果a=b a在b的前面,排序后a仍然在b的前面
不稳定性:如果a=b a在b的前面 ,排序之后可能会发生位置变化

选择排序:
平均时间复杂度O(nn)
最好情况O(n
n)
最差情况O(n*n)
空间复杂度O(1)
稳定性:不稳定

在算法实现的时候,每一趟确定最小元素的时候都会通过不断比较交换来使得首位置的当前为最小,每次交换都比较耗费时间,分析后发现 在没有确定最小的元素的时候,这些就艾欧换都是没意义的,要背最后一次交换去覆盖了。所以我们需要设置一个最小值min,每次比较仅存最小元素的数组下标,当每次循环结束之后,把这个最小下标的元素释放出来在进行交换,这样叫交换的次数大大减少。
基础实现:

function func(arr){
                for(var i = 0; i <arr.length;i++){
                    var mun = i
                    for(var j = i; j < arr.length; j++){
                        if(arr[j] < arr[mun]){
                            mun = j
                        }
                    }
                    var temp = arr[mun]
                    arr[mun] = arr[i]
                    arr[i] = temp
                }
                return arr
            }

优化代码实现:

// 排序算法
function selectSort(array) {
    let length = array.length;
    // 如果不是数组或者数组长度小于1,直接放回
    if(!Array.isArray(array) || length<=1)return;
    for (let i =0; i<length -1; i++){
        let minIndex = i ;//设置当前循环为最小元素索引
        for (let j= i+1;j< length ; j++){
            //如果当前元素比最小元素索引小,则更新最小元素索引
            if(array[minIndex] > array[j]){
                minIndex = j;
            }
            //交换最小元素到当前位置
               // [array[i], array[minIndex]] = [array[minIndex], array[i]];
            swap(array, i, minIndex);
        }
        return array;
    }
    // 交换数组中两个元素中的位置
    function swap(array ,left,right){
        var temp = array[left];
        array[left]=array[right];
        array[right] = temp;
    }


}

这里采用了swap方法:(交换值的方法)
可以参考这篇文章:swap使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十九万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值