Web 前端开发 让前端飞前端从入门到放弃

查找数组中的第K大数(未完)

2019-11-13  本文已影响0人  青山旁小溪边

写在前面的一些话

本文通过一个小问题,用多种方式解答,其中涉及到的算法不会去详细介绍,所以请看之前要有一定的算法基础,如:排列,二分等

问题

描述

设数组 A[0..N-1] 存在 N 个无序整数,找到数组 A 中的第 K(1≤K≤N) 大数。注意:结果是顺序排序后的第 K 个最大的元素,而不是第 K 个不同的最大元素。

示例

输入:A=[4,2,6,7,1,3] K=3
输出:3

随机数组

为了方便起见,还是写个随机生成数组的函数。

const randomAry = (n = 10, range = { min: 1, max: 99 }) => {
  let arr = Array.from({ length: n });
  arr = arr.map(() => {
    return Math.floor(Math.random() * (range.max - range.min + 1) + range.min);
  });
  // 去重
  arr = Array.from(new Set(arr));
  console.log(`random - ${arr}`);
  return arr;
};
let array = randomAry();

思路

1. Array.prototype.sort()

利用javascript中的sort()函数,对数组元素从大到小排序。
由于不同的js引擎对sort()的实现不同,所以不能保证排序的时间和空间复杂度。

const findKth = (arr, K) => {
  arr.sort((a, b) => b - a);
  return { arr: arr, K: arr[K - 1] };
};
let result = findKth(array, 3);
// { arr: [ 91, 86, 70, 62, 61, 56, 47, 42, 38 ], K: 70 }

选择排序

/**
 * @Description: 每次从剩余数组元素中找到最大的元素,并将其从数组中剔除,知道进行到K次操作
 * @param { Array }: 随机数组
 * @param { Number }: 查找的第K数
 * @return { Object }:{arr:排列完的数组元素,K:第K最大} 
 */
const findKthC = (arr, K) => {
  let i = 0;
  while (i <= K) {
    if (!arr.length) break;
    let j = 0;
    for (let index = 0; index < arr.length; index++) {
      if (arr[index] > arr[j]) {
        j = index;
      }
    }
    if (i === K - 1) return arr[j];
    arr.splice(j, 1);
    i += 1;
  }
};
// { arr: [ 79, 69, 56, 50, 39, 23, 22, 8 ], K: 79 }
/**
 * @Description: 选择排序过程中,把每次查找到的数组元素最大元素添加到一直排序序列A[0...i-1]的末尾
 * @param { Array }: 随机数组
 * @param { Number }: 查找的第K数
 * @return { Object }:{arr:排列完的数组元素,K:第K最大} 
 */
const findKthC_1 = (arr, K) => {
  for (let i = 0; i < arr.length - 1; i++) {
    let max = i;
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[j] > arr[max]) {
        max = j;
      }
    }
    [arr[i], arr[max]] = [arr[max], arr[i]];
  }
  return { arr: arr, K: arr[K - 1] };
};
// { arr: [ 96, 85, 73, 44, 34, 31, 21, 20, 13, 4 ], K: 73 }

有空在写 其他排序

上一篇 下一篇

猜你喜欢

热点阅读