1. 程式人生 > >利用快排思想找出陣列中第k大的元素

利用快排思想找出陣列中第k大的元素

#include <iostream>
#include <vector>
using namespace std;

//用快排的思想:例如找49個元素裡面第24大的元素,那麼按如下步驟:
//1.進行一次快排(將大的元素放在前半段,小的元素放在後半段), 假設得到的中軸為p
//2.判斷 k -1==p - low,如果成立,直接輸出a[p],(因為前半段有k - 1個大於a[p]的元素,故a[p]為第K大的元素)
//3.如果 k -1 < p - low, 則第k大的元素在前半段,此時更新high = p - 1,繼續進行步驟1
//4.如果 k -1 > p - low, 則第k大的元素在後半段,此時更新low = p + 1, 且 k = k - (p - low + 1),繼續步驟1.
//由於常規快排要得到整體有序的陣列,而此方法每次可以去掉“一半”的元素,故實際的複雜度不是o(nlgn), 而是o(n)。
class Finder 
{
public:
	int partition(vector<int>&a, int low, int high)//找樞紐
	{
		int first = low;
		int	last = high;
		int key = a[first];//用字表的第一個記錄作為樞軸

		while (first < last)
		{
			while (a[last] >= key && first < last)
				--last;
			swap(a[first], a[last]);

			while (a[first] <= key && first < last)
				++first;
			swap(a[first], a[last]);
		}
		return first;//返回一個樞紐
	}

	int findKth(vector<int>& a, int low, int high, int k)
	{
		int p = partition(a, low, high);
		if (k == p - low + 1)
			return a[p];

		else if (k - 1 < p - low)//則第k大的元素在前半段
			return findKth(a, low, p - 1, k);

		else //則第k大的元素在後半段
			return findKth(a, p + 1, high, k - p + low - 1);
	}

	int findKth(vector<int> a, int n, int K)
	{
		return findKth(a, 0, n - 1, K);
	}

};

//測試
int main()
{
	vector<int> v{ 6, 2, 7, 3, 8, 9, 11, 5, 78, 34, 13 };

	Finder solution;
	cout << solution.findKth(v,v.size(), 6)<<endl;
}

相關推薦

利用思想陣列k元素

#include <iostream> #include <vector> using namespace std; //用快排的思想:例如找49個元素裡面第24大的元素,那麼按如下步驟: //1.進行一次快排(將大的元素放在前半段,小的元素放在後

劍指Offer/滴滴2018校招筆試題-陣列K元素-雙路實現

程式設計題例項 滴滴2018校招筆試題程式設計題2: 找出陣列中第K大的元素 輸入 45,66,58,22 2 輸出 45 程式設計原理 這道題與

陣列k的數(時間複雜度分析、C++程式碼實現). TopK in array. ( leetcode

找出陣列中第k大的數. TopK in array. ( leetcode - 215 ) 最近面試過程中遇到的一個題目,也是大資料時代常見的題目,就來總結一下。 面試題目: 1、10億數中,找出最大的100個數。用你能想到的最優的時間和空間效率。 2

前端演算法題:陣列k的數字出現多少次

題目:給定一個一維陣列,如[1,2,4,4,3,5],找出陣列中第k大的數字出現多少次。 例如:第2大的數是4,出現2次,最後輸出 4,2 function getNum(arr, k){ // 陣列排序-&gt;從大到小 arr.sort((a, b)=&gt;{

陣列K個最小的數(快速排序)

問題描述:給定一個無序的陣列,從一個數組中找出第K個最小的數,例如,對於給定陣列序列{1,5,2,6,8,0,6},其中第4小的數為5。 演算法思路:採用快速排序,分而治之的思想,根據主元,每次Partiton以主元為軸,比它小的數在左邊,比它大的數在右邊,判

Java面試寶典——求陣列兩兩相加等於指定數的組合種數 + 如何陣列k個最小的數

求陣列中兩兩相加等於指定數的組合種數package demos.array; import java.util.Arrays; /** * @author wyl * @time 2018年7

陣列k個數

思路: 由於快排每趟排序,排好一個元素、以遞迴的方式、對排好序的元素的兩邊再繼續排序 【前半部分小於當前元素值、後半部分大於當前值】。 查詢第k大個元素時,先執行一次快排,判斷排序好的位置、若不為k,

Java實現O(log(n+m))兩個有序陣列K元素位數

假設有兩個從小到大的有序陣列A和B,他們的元素個數為N和M,那麼怎麼求得其第K大元素呢?同理,求其中位數就是當N+M為奇數求其第(N+M+1)/2大元素,為偶數時求(N+M)/2和(N+M+2)/2大元素的平均值。 那麼我們怎麼才能求得第K大元素呢? 分別取兩個陣列中間索

尋找無序陣列k的數——思想

找陣列中第k大的數,避免o(n2)時間,考慮快排方法。 #include <iostream> #include <cstdlib> using namespace std; int random_partion(int *p,int n) {

陣列唯一的重複元素

題目:陣列 arr[N],1 至 N 這 N - 1 個數存放在 arr[N] 中,其中某個數重複一次,寫一個函式,找出重複的數字。要求每個陣列元素只能訪問一次,不用輔助儲存空間。 分析:由於題目要求每個陣列元素只能訪問一次,不用輔助儲存空間,可以從原理上入手

陣列的最值方法總結

<!DOCTYPE html> <html> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><

陣列的第二數字

寫一個函式,找出陣列中第二大的數字 使用的是比較的方法: 程式碼如下: //找出陣列中第二大的數 #include<iostream> #include<time.h> #define N 15 #define d 3 using namespace

2018騰訊內部調崗面試試題3——陣列比左邊比右邊的小的元素

題目:以時間複雜度O(n)從長度為n的陣列中找出同時滿足下面兩個條件的所有元素: (1)該元素比放在它前面的所有元素都大; (2)該元素比放在它後面的所有元素都小。 分析:面試官給的上面冗餘的描述

leetcode_陣列k元素

215. 陣列中的第K個最大元素 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。 示例 1: 輸入: [3,2,1,5,6,4] 和 k = 2 輸出: 5

找到陣列k值的位置

找出陣列中第K大小的數,輸出數所在的位置。例如{2,4,3,4,7},第1大的數是7,位置在4。第2大,第3大的數是4,位置在1,3,則返回1和3都可以。 分析:考慮map:map<key,value> 自帶對value去重和對key排序的功能,所以可以把位置下

LeetCode215 陣列K元素

Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order

求取一組無序陣列k的數

方法1.:維持一個大小為k最小堆, 後面來的數小或者等於堆頂元素,則跳過,; 後面來的數大於堆頂元素,堆頂元素彈出,新元素加入最小堆   最後留下的k個數就是,所有數中前k大的數,堆頂元素就是第k大的數 時間複雜度:由於維持大小為k的堆花費時間為log(k),所以時間

各個排序演算法應用:求取陣列K的數( LeetCode 215. Kth Largest Element in an Array )

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

C++ sort + vector 應用:求取陣列K的數( LeetCode 215. Kth Largest Element in an Array )

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.