• 数组的三种主要排序


    介绍一下我自己,是一名在校培训的初级程序员,所以写的东西可能会有bug,还请大神多多指教

    第一种是冒泡排序,简单的来形容就是两两比较,就好像是一组人比身高,下面让我们举个例子

    假设有一个这样的数组 var arr = [10,9,8,7,6],来用冒泡排序来进行排序
    第一轮   有5个数进行比较,两两比较,较大的数向后排列,最后得到一个最大的数 10
    9 10 8 7 6  
    9 8 10 7 6
    9 8 7 10 6
    9 8 7 6 10
     
    第二轮  去除第一轮得到的最大数10,剩余的数进行排列,得到一个9,再进行下一轮
    8 9 7 6
    8 7 9 6
    8 7 6 9

    第三轮
    7 8 6
    7 6 8
    第四轮 7 6 1
    6 7

    比到第四轮时就可以得到我们想要的结果了--最小数6

    【注】:通过以上演变我们得出一个结论也就是说比较的次数等于数组的长度减一; 每一次的比较内部需要两两比较的次数是 数组的长度-1-i

    接下来是代码部分

    var arr = [10,9,8,7,6];
    var temp;
    for(var i=0;i<arr.length-1;i++){
         for(var j=0;j<arr.length-1-i;j++){
           if(arr[j]>arr[j+1]){
              temp = arr[j];
              arr[j] = arr[j+1];
              arr[j+1] = temp;
          }
      }
    }

    console.log(arr);
     
    第二种是选择排序,类似于打擂台,你必须要跟每一个对手打架,赢得站在第一位,输了则要向后排
    同样是上面的数组 var arr = [10,9,8,7,6],这次用选择排序来进行数组排序
    [10,9,8,7,6];
    和冒泡排序相反,我们每轮得到是一个最小的数
    第一轮比较    7
    9 10 8 7 6
    8 10 9 7 6
    7 10 9 8 6
    6 10 9 8 7
     
    第二轮   8
    9 10 8 7
    8 10 9 7
    7 10 9 8
     
    第三轮   9
    9 10 8
    8 10 9

    第四轮   10
    9 10
     
    【注】:首先看比较次数的规律:数组的长度-1;每轮比较的规律:每次比较的位置都是当前数字的位置+1进行的比较
    代码部分:
    function Selection(arr){
    var arr = [10,9,8,7,6];
    var temp;
    for(var i=0;i<arr.length-1;i++){
         for(var j=i+1;j<arr.length;j++){
                 if(arr[i]>arr[j]){
                           temp = arr[i];
                            arr[i] = arr[j];
                             arr[j] = temp;
                     } 
               }
        }
      return arr;
    }

    console.log(arr);
     
    第三种是快速排序,它是三中排序中性能最好的
     排序概念:将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边。比较完毕后再次取中间值,再次比较一次类推
     思路
           1、取的中间值,以及中间值的下标
      2、创建一个left空数组,存放小于中间值的数据
      3、创建一个right空数组,存放大于中间值的数据
      4、递归的终止条件,如果数组的长度等于1的时候就返回数组
      5、循环将数组一分为二
      6、递归
    代码部分
    var arr = [10,66,3,64,2,98];
     
    function fn(arr){
          var index = arr.length%2 == 0?arr.length/2 : (arr.length+1)/2;
          var mid = arr[index];
          var left = [];
          var right = [];
           if(arr.length<2){
                  return arr;
            }
     
            for(var i=0;i<arr.length;i++){
                    if(index !=i && arr[i]<mid){
                             left.push(arr[i]);
                       }
                  if(index != i && arr[i]>=mid){
                          right.push(arr[i]);
                     }
              }
                return fn(left).concat(mid).concat(fn(right));
    }
    console.log(fn(arr));
  • 相关阅读:
    java利用透明的图片轮廓抠图
    java单例之enum实现方式
    spring之ControllerAdvice注解
    memcached命令
    2016年开源巨献:来自百度的71款开源项目
    dubbo通信协议之对比
    Elasticsearch权威指南(中文版)
    Apache shiro之权限校验流程
    简单的freemarker解析测试
    Apache shiro之身份验证(登陆)流程
  • 原文地址:https://www.cnblogs.com/wwmm1996/p/10742778.html
Copyright © 2020-2023  润新知