📅  最后修改于: 2023-12-03 15:31:43.850000             🧑  作者: Mango
在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的值放在数组右边。
对于简单的数组,可以使用排序方法查找中位数。如果需要更快的速度,可以使用快速选择算法。不管是哪种方法,都需要对数据进行一定的处理才能得到正确的结果。