📜  javascript 数组的中位数 - Javascript (1)

📅  最后修改于: 2023-12-03 15:31:43.850000             🧑  作者: Mango

Javascript 数组的中位数

在Javascript中,数组是一种常用的数据结构。数组的中位数是一组数据中的中间值,即把数据从小到大排序后位于中间位置的数值。对于一个长度为n的数组,若n为奇数,则中位数是第(n+1)/2个数;若n为偶数,则中位数是第n/2个数和第(n/2+1)个数的平均值。

方法一:排序

最简单的方法是先将数组排序,然后根据数组长度的奇偶性来决定中位数的位置。代码如下:

function median(arr) {
  arr.sort(function(a,b){return a-b;});
  var half = Math.floor(arr.length/2);
  if(arr.length % 2 == 0) {
      return (arr[half-1] + arr[half]) / 2.0;
  } else {
      return arr[half];
  }
}

以上代码中,sort()方法用于将数组从小到大排序,然后根据数组长度判断中位数的位置。如果数组长度为偶数,则返回中间两个数的平均值;如果数组长度为奇数,则返回中间的那个数。

方法二:快速选择算法

上述方法的时间复杂度为O(nlogn),因为要对数组进行排序。如果需要在更短的时间内找到中位数,可以使用快速选择算法。该算法实际上就是快速排序算法的一部分,它会随机选择一个pivot值,然后将数组分成两个部分,其中一部分包含所有小于pivot的值,另一部分包含所有大于等于pivot的值。然后根据pivot的下标位置,将数组分为三个部分:小于pivot的值、大于pivot的值和等于pivot的值。如果pivot的下标位置等于数组长度的中间位置,则找到了中位数。如果pivot的下标位置小于中间位置,则在大于pivot的部分继续查找中位数,反之,在小于pivot的部分继续查找中位数。

function quickselect_median(arr, low, high) {
    if(low == high) return arr[low];
    let pivotIndex = Math.floor((low + high) / 2);
    pivotIndex = partition(arr, low, high, pivotIndex);
    if(pivotIndex === arr.length / 2) {
        return arr[pivotIndex];
    } else if(pivotIndex > arr.length / 2) {
        return quickselect_median(arr, low, pivotIndex - 1);
    } else {
        return quickselect_median(arr, pivotIndex + 1, high);
    }
}

function partition(arr, low, high, pivotIndex) {
    let pivotValue = arr[pivotIndex];
    swap(arr, pivotIndex, high);
    let storeIndex = low;
    for(let i = low; i < high; i++) {
        if(arr[i] < pivotValue) {
            swap(arr, i, storeIndex);
            storeIndex++;
        }
    }
    swap(arr, storeIndex, high);
    return storeIndex;
}

function swap(arr, a, b) {
    let temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

以上代码是快速选择算法的实现。quickselect_median()函数用于寻找中位数,low和high参数分别表示数组的起始和结束位置。首先计算出pivot值的下标位置,然后将数组分为三部分。如果pivot的下标位置等于数组长度的中间位置,那么找到了中位数,返回pivot值即可。如果pivot的下标位置小于中间位置,那么在大于pivot的部分继续寻找中位数。如果pivot的下标位置大于中间位置,那么在小于pivot的部分继续寻找中位数。partition()函数用于将数组分为两部分,将小于pivot的值放在数组左边,将大于等于pivot的值放在数组右边。

总结

对于简单的数组,可以使用排序方法查找中位数。如果需要更快的速度,可以使用快速选择算法。不管是哪种方法,都需要对数据进行一定的处理才能得到正确的结果。