zoukankan      html  css  js  c++  java
  • 基本的排序算法

    基本的排序算法

    算法的学习核心是:思路,知道思路,清楚思路,明白思路的思考过程,写代码就会很轻松

    快速排序 (递归的方法)

    快速排序就是大学学的折半查找算法,或者说是二分查找;时间复杂度:每次把搜索区减少一半,最坏的时间复杂度:O(n*n),最优的时间复杂度:O(n*logn);n表示集合中元素的个数;空间复杂度O(1)

    • 对于一个给定的数组var ary思路

      1. 首先取得数组中间位置上面的数,使其成为一个等待被比较的数组left

        这个过程使用到数组的ary.splice(parseInt(arr.length/2),1)这个方法返回的是被删除的数组,要取得这个数组里面的数,需要这样:ary.splice(parseInt(arr.length/2),1)[0],此时原来的ary中已经没有了中间的那个数组,变成了一个新的数组。

      2. 创建两个空的数组,分别来保存比较的大值和小值

        var left=[];  //存储与中间值比较的小值
        var  right=[]; //存储与中间值比较的大值
      3. 分别遍历数组中的每一项,与中间值进行比较

         for(var i=0;i<arr.length;i++){
            if(arr[i]>num){
                right.push(arr[i]);
            }else{
                left.push(arr[i]);
            }
         }
      4. 返回排好顺序的数组,使用数组的拼接方法,把leftright排好序的拼接起来concat(),由于leftright也是数组,它们里面的数也需要进行排序,此时使用递归

        return quickSort(left).concat(num,quickSort(right));
      5. 最后要设置停止拆分的条件

        if(arr.length<=1){
            return arr;}

    完整代码:

    //封装成为一个比较函数,传入比较的数组
    function quickSort(arr){
    //第五步
             if(arr.length<=1){
                return arr;
            }
    
      //第一步
           var num=arr.splice(parseInt(arr.length/2),1);
    //第二步
           var left=[];
           var right=[];
           //第三步
       for(var i=0;i<arr.length;i++){
             if(arr[i]<num){
                 left.push(arr[i]);
            }else{
               right.push(arr[i]);
          }
    
       }
    //第四步
    return quickSort(left).concat(num,quickSort(right));
    
    }
    插入排序 (不适合数据量比较大的排序)

    思路:对于未排序的数组,在已经排好序的数组里面从后往前扫描。找到相对应的位置插入;最好的算法复杂度:O(n)最坏的算法复杂度:O(n*n)空间复杂度:O(n)

    • 首先创建一个数组left,从要排序的数组里面取得一个数放入其中,作为我们比较的对象;此时的原数组里面不包括刚才我们所取得的那个数,变成了一个新的数组,防止取得的这个数与自己相比较。这里也要使用数组的arr.splice(0,1)
      var left=arr.splice(0,1)//返回从位置0删除一个的数组
    • 遍历原先那个去掉比较对象的新数组,分别与我们的比较对象left进行比较,从后往前
    for(var i=0;i<arr.length;i++){
       for(var j=left.length-1;j>=0;){
         //进行比较left和arr[i]
              if(arr[i]<left[j]){
         //说明arr[i]的值比left[j]值小,我们需要向前继续向前查找left数组 故
               j--;
    
               //判断是否到了left数组的头部,到了就把arr[i]插入到left数组的头部
               if(j==-1){
                    left.unshift(arr[i]);//此时的left数组变成了一个新的数组
                }
    
            }else{
               //说明arr[i]比left[j]大,其应该插入到left[j]的前面位置
               left.splice(j+1,0,arr[i]);
               break;//此时一轮比较完毕,跳出内循环,重新开始外循环
    
             }
       }
    
    
    
    }
    • 最后返回已经排好序的数组

    完整代码:

    function insertSort(arr){
         var left=arr.splice(0,1);
         for(var i=0;i<arr.length;i++){
    
            for(var j=left.length-1;j>=0;){
    
               if(arr[i]<left[j]){
    
                   j--;
                   if(j==-1){
                      left.unshift(arr[i]);
                    }
    
                }else{
    
                    left.splice(j+1,0,arr[i]);
                    break;
                  }
    
            }
    
      }
     return left;
    }
    冒泡排序
    1. 比较相邻的元素。如果第一个比第二个大,就交换其位置
    2. 对每一个相邻元素作相同的工作,这一步完成就得到了最大的数,重复操作
    3. 时间复杂度:O(n*n)空间复杂度:O(n)最优时间复杂度:O(n)
    • 外循环决定轮数,内循环决定比较次数,

      1. 最简单的一种方法实现:
    function bubbleSort(arr){
    
         var tmp; 
         for(var i=0;i<arr.length;i++){
              for(var j=i+1;j<arr.length;j++){
                  if(arr[i]>arr[j]){
                     tmp=arr[i];
                     arr[i]=arr[j];
                     arr[j]=tmp; 
               }
           }
       }
    
      return arr;
    }
    1. 稍微简单的一种方法实现:
    function bubbleSort(arr){
    
         var tmp; 
         for(var i=0;i<arr.length;i++){
              for(var j=0;j<arr.length-i;j++){
                  if(arr[j]>arr[j+1]){
                     tmp=arr[j];
                     arr[j]=arr[j+1];
                     arr[j+1]=tmp; 
               }
           }
       }
    
      return arr;
    }
    1. 封装一下,带有布尔值的参数,从而控制是从大到小还是从小到大的排序:
    //带有布尔值的,传入true or false 来控制从大到小还是从小到大  不传默认fasle
    function bubbleSort(arr, flag) 
    {
        for(var i = 0; i < arr.length; i++) 
        {
           for(var j = i + 1; j < arr.length; j++)
           {
             if(flag) 
              {
                if(arr[i] > arr[j]) {
                var tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                }
            } else {
                if(arr[i] < arr[j]) {
                var tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                }
            }                           
        }
    }                       
        return arr;
    }
    1. 继续封装,使用三目运算符,精简代码:
    function bubbleSort(arr, flag) {
        var bu;
        for(var i = 0; i < arr.length; i++) {
            for(var j = i + 1; j < arr.length; j++) {
                bu = flag ? (arr[i] > arr[j]) : (arr[i] < arr[j]);
                change(bu);
            }
        }
        //把arr[i] > arr[j] 或者 arr[i] < arr[j]  传入
        function change(flag) {
            if(flag) {
                var tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                }
            }
    return arr;
    }
    
  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/linewman/p/9918375.html
Copyright © 2011-2022 走看看