描述前端
設數組
A[0..N-1]
存在 N 個無序整數,找到數組 A 中的第 K(1≤K≤N) 大數。面試注意:結果是順序排序後的第 K 個最大的元素,而不是第 K 個不一樣的最大元素。數組
示例bash
輸入:A=[3, 7, 1, 6, 9, 1, 2], K=4ui
輸出:6spa
這道題目實際就是數組排序的變種。只要將數組排序好,就能找到對應的值。下面列出能想到的一些方案:prototype
1. Array.prototype.sort()code
利用 JavaScript 標準庫中提供的 sort()
方法,對數組元素進行從大到小排序。cdn
因爲不一樣的 JavaScript
引擎對 sort()
方法的具體實現不一樣,所以沒法保證排序的時間和空間複雜度。排序
function findKthLargest(nums, k) {
nums.sort((a, b) => b - a)
return nums[k - 1]
}
複製代碼
2. 選擇排序
利用咱們生活中最直觀的查找方式:每次從數組剩餘元素中找到最大的元素,並將其從數組中剔除,直至進行到第 K 次操做。時間複雜度爲 O(n^2)
。
let i = 0
while (i <= k) {
if (!nums.length) break
let j = 0
for (let index = 0; index < nums.length; index++) {
if (nums[index] > nums[j]) {
j = index
}
}
if (i === k - 1) return nums[j]
nums.splice(j, 1)
i += 1
}
複製代碼
這與選擇排序原理很是類似,不一樣之處在於,選擇排序過程當中沒有將每次查找到的最大元素從數組中剔除,而是把它添加到已排序序列 A[0..i-1]
的末尾。
for (let i = 0; i < nums.length - 1; i++) {
let max = i
for (let j = i + 1; j < nums.length; j++) {
if (nums[j] > nums[max]) {
max = j
}
}
[nums[i], nums[max]] = [nums[max], nums[i]]
}
複製代碼
3. 快速排序
如下這種快速排序的寫法,是從 Free Pascal
的 Demo
目錄文件中學到的,也一直沿用至今。 平均時間複雜度爲 O(nlogn)
,爲了不快速排序退化至 O(n^2)
,採用了隨機化劃分基準。
var quickSort = function(arr) {
  if (arr.length <= 1) { return arr; }
  var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];
  for (var i = 0; i < arr.length; i++){
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort(left).concat([pivot], quickSort(right));
};
複製代碼
掃一掃 關注個人公衆號【前端名獅】,更多精彩內容陪伴你!