c语言编程笔录

首页 >   > 笔记大全

笔记大全

JavaScript如何求数组中位数

更新时间:2023-07-13

前言

当我们需要对一个数组进行排序或统计时,一般会涉及到数组中位数的计算。而在JavaScript中,我们可以使用不同的方法来计算一个数组的中位数,本文将会介绍一些方法,并给出代码示例。

方法一:排序法

数组排序是求中位数的一种常见方法,我们对数组进行排序后,再根据数组长度的奇偶性来选择中间点或者中间两个数字来计算中位数。

      function median(array) {
        var mid=Math.floor(array.length / 2);
        array.sort(function(a, b) { return a - b;});
        return array.length % 2 !==0 ? array[mid] : (array[mid - 1] + array[mid]) / 2;
      }
      var arr1=[5, 2, 6, 7, 8, 9];
      console.log(median(arr1)); // 6.5
    

方法二:中位数公式法

当数组的长度为奇数时,中位数为排序后的中间数,而当长度为偶数时,中位数为排序后中间两个数的平均值。根据这个特性,我们可以使用中位数公式来计算中位数。

      function median(array) {
        var mid=Math.floor(array.length / 2);
        array.sort(function(a, b) { return a - b;});
        return array.length % 2 !==0 ? array[mid] : (array[mid - 1] + array[mid]) / 2;
      }
      var arr2=[5, 2, 6, 7, 8];
      function getMedian(array) {
        var mid=Math.floor(array.length / 2);
        if (array.length % 2 !==0) {
          return median(array.slice(mid, mid+1));
        } 
        else {
          return (median(array.slice(mid - 1, mid)) + median(array.slice(mid, mid+1))) / 2;
        }
      }
      console.log(getMedian(arr2)); // 6
    

方法三:双指针法

双指针法是一种不需要排序的方法来计算中位数的方法,适用于数组较大的情况。我们可以采用类似于归并排序的思路,在数组中使用两个指针来遍历数组,一次遍历过程中,同时确定第一个数和最后一个数的位置,以此来计算中位数。

      function median(arr1, arr2) {
        var m=arr1.length;
        var n=arr2.length;
        var l=Math.floor((m + n + 1) / 2);
        var r=Math.floor((m + n + 2) / 2);
        return (getKth(arr1, 0, arr2, 0, l) + getKth(arr1, 0, arr2, 0, r)) / 2;
      }
      function getKth(arr1, start1, arr2, start2, k) {
        if (start1 >=arr1.length) return arr2[start2 + k - 1];
        if (start2 >=arr2.length) return arr1[start1 + k - 1];
        if (k===1) return Math.min(arr1[start1], arr2[start2]);
        var mid=Math.floor(k / 2);
        var midVal1=(start1 + mid - 1 < arr1.length) ? arr1[start1 + mid - 1] : Number.MAX_VALUE;
        var midVal2=(start2 + mid - 1 < arr2.length) ? arr2[start2 + mid - 1] : Number.MAX_VALUE;
        if (midVal1 < midVal2) {
          return getKth(arr1, start1 + mid, arr2, start2, k - mid);
        } else {
          return getKth(arr1, start1, arr2, start2 + mid, k - mid);
        }
      }
      var arr3=[1,3,4,6,7,9];
      var arr4=[2,5,8];
      console.log(median(arr3, arr4)); // 5
    

总结

在JavaScript中,我们可以使用多种方法来计算一个数组的中位数,包括排序、中位数公式、双指针法等。排序法虽然简单易懂,但时间复杂度为O(nlogn),适用于较小的数组;中位数公式更加简单,但数组长度为偶数时需要排序两次,时间复杂度为O(nlogn),相较于排序法更为优秀;双指针法不需要进行排序,时间复杂度为O(log(m + n)),更适用于较大的数组。在实际问题中,我们需要根据实际情况选择相应的方法来计算中位数。