第12題-無處不在的排序算法

面試題目(常考題型)

描述前端

設數組 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 PascalDemo 目錄文件中學到的,也一直沿用至今。 平均時間複雜度爲 O(nlogn),爲了不快速排序退化至 O(n^2),採用了隨機化劃分基準。

var quickSort = function(arr) {
&emsp;&emsp;if (arr.length <= 1) { return arr; }
&emsp;&emsp;var pivotIndex = Math.floor(arr.length / 2);
&emsp;&emsp;var pivot = arr.splice(pivotIndex, 1)[0];
&emsp;&emsp;var left = [];
&emsp;&emsp;var right = [];
&emsp;&emsp;for (var i = 0; i < arr.length; i++){
&emsp;&emsp;&emsp;&emsp;if (arr[i] < pivot) {
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;left.push(arr[i]);
&emsp;&emsp;&emsp;&emsp;} else {
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;right.push(arr[i]);
&emsp;&emsp;&emsp;&emsp;}
&emsp;&emsp;}
&emsp;&emsp;return quickSort(left).concat([pivot], quickSort(right));
};
複製代碼

掃一掃 關注個人公衆號【前端名獅】,更多精彩內容陪伴你!

【前端名獅】
相關文章
相關標籤/搜索