找出未排序整数数组的中位数

题目- 中位数

给定一个未排序的整数数组,找到其中位数。

中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第 N/2 个数。

示例

给出数组[4, 5, 1, 2, 3], 返回 3

给出数组[7, 9, 4, 5],返回 5

分析

简单的思路就是先排序,然后根据中位数规则取中位数

想想,能不能不排序直接取中位数?或者排序的同时取中位数。

排序可以用哪些方法? 参考:常见排序算法的时间复杂度,空间复杂度

Just Try

请你自动动手试一下:在线编程环境

想想有没有其他思路?

想想时间和空间复杂度,能否优化一下

真的做不到么?

let you think, think makes you happy!

参考答案

选择排序的实现如下:

function algorithm(arr){
  let  k=0;
  for(let i=0; i< Math.ceil(arr.length/2); i++){
    for(let j=i+1; j< arr.length; j++){
      if(arr[i] > arr[j]){
        k = arr[j]
        arr[j] = arr[i]
        arr[i] = k
      }
    }
  }
  if(arr.length%2==0)
    return arr[arr.length/2-1]
  if(arr.length%2==1)
    return arr[Math.floor(arr.length/2)]
}
function main(param) {
  console.show("参数:" + param, "结果:" + algorithm(param))
  console.show(testPerformance(algorithm, param))
}
main([4, 5, 1, 2, 3])
main([7, 9, 4, 5])

这种双重循环的代码唯一的缺点就是时间复杂度高,只是外层循环减少了一半而已,时间复杂度o(n/2*log(n)),应该有更好的办法来做

请你自动动手试一下:在线编程环境

冒泡排序

function algorithm(arr){
  let  k=0;
  for(let i=0; i< Math.ceil(arr.length/2); i++){
    for(let j=0; j< arr.length-i; j++){
      if(arr[j] > arr[j+1]){
        k = arr[j+1]
        arr[j+1] = arr[j]
        arr[j] = k
      }
    }
  }
  if(arr.length%2==0)
    return arr[arr.length/2-1]
  if(arr.length%2==1)
    return arr[Math.floor(arr.length/2)]
}

快速排序

快速排序的思想和中位数的概念有类似,参考快排

function algorithm(arr){
  if(arr.length <= 1) return arr
  let j = arr[0]
  let tmp = [[],[],[j]];
  arr.forEach((k,i)=>{
    if(k>j){
      tmp[1].push(k)
    }
    if(k<j){
      tmp[0].push(k)
    }
   if(k==j && i!=0){
      tmp[2].push(k)
    }
  })
  return algorithm(tmp[0]).concat(tmp[2]).concat(algorithm(tmp[1]))
}
function main(param) {
  console.show("参数:" + param, "结果:" + JSON.stringify(algorithm(param)))
  testPerformance(algorithm, param)
}
main([5,1,2,3,4,5,9,8,3,8]);


请遵守《互联网环境法规》文明发言,欢迎讨论问题
扫码反馈

扫一扫,反馈当前页面

咨询反馈
扫码关注
返回顶部