冒泡排序与选择排序

一.冒泡排序(交换储存的数据)
原理:
两个相邻的单元,比较数据大小,第一个单元数值较大, 就交换两个单元存储的数据。
过程:
从起始单元开始比较,第一次循环会选出最大值放 在数组的最后一个单元。并不会再参加以后的比较。
之后每次循环都会比较出剩下的数据中最大的一个,依次从后面排放。
优化:
每次循环,最后一个单元是通过倒数第二个单元进行比较的。不用再次进行循环比较。所以循环次数可以减一。
之前循环比较出的最大值,不在参与下一次的比较
N个单元,只需要循环比较n-1次。
下面附上优化代码与注释:

 var  arr = [5,8,2,4,3,6,9,7,1]
 //因为最后一次排序会确定最后两个数的大小并且排序好,所以次数要减1
 for(var j=0;j<arr.length;j++ ){
 //内层循环定义i为0,也就是第一个数据
 //由于每次最后一个数在倒数第二次就进行了比较,所以没必要在进行一次比较,所以减1
 //因为每完成一次循环,每次的最后一个数都已经进行过比较,交换过了,所以循环次数要减去j。
      for(var i =0 ;i< arr.length-1-j ; i++){
      //第一次循环从索引为0开始去跟索引为1的比较
                 if(arr[i]>arr[i+1]){
                 //如果索引为0的大于索引1的数值,那就交换数据   
                        var c = 0;
                        c= arr[i];
                        arr[i]=arr[i+1];
                        arr[i+1]=c;
                    }
                    //每次循环找到的此次循环的最大数,并赋值到最后面。
            }
          console.log (arr); 
          }

二,选择排序(寻找最小数值的索引,与起始位置交换数值)
代码原理:
1.先定义循环的起始位置,默认为最小值所在位置。
2.从下一个位置开始执行循环,找到最小值的索引值。
3.比较储存的索引值,是否为起始位置的索引
如果不是,就交换两个位置的数值。
会将此次循环的最小值放在循环起始位置
4.通过多次循环,完成排序。

优化:
之前比较晚的数值不参与下一次循环
N个单元,只比较n-1次
下面是代码与注释:

 var arr=[5,1,4,2,3,9,8,6,7]
 //因为最后一次不需要比较,前一次就比较并排好了 ,所以循环次数是减一。
        for(var j = 0 ; j< arr.length-1; j++){
        //假设变量的值就是最小数的索引下标
            var min = j;
            //从min后面开始找比前面数小的数,min的值就是j
            //第一次循环j是0,就是从索引下标是1的开始与索引下标是0的比较。所以i=j+1。
            for(var i = j+1; i< arr.length;i++){
            //这里的if判断是如果前面的数比后面的大,那么就把小的索引下标赋值给min,这样一次一次的赋值,到最后min就是最小数值的索引下标了
                if(arr[min]>arr[i]){
                    min = i;
                }
            }
            //这里如果最小数的索引下标与j不一样,那就做内容交换赋值,
                    if(min != j){
            var c = 0;
            c = arr[j];
            arr[j]=arr[min];
            arr[min]=c                
            }
            //这样循环一次完成一个最小数的排序
        }
        console.log(arr);

注 优点:
选择排序:每次都是找到最小的索引值后在做一次数据交换
冒泡排序:每次前面一个单元比后面的一个大就会执行一次交换操作,次数高于选择排序。
执行次数过多,会导致执行效率低。

逆战班

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值