求一陣列前k大的所有數

2021-08-07 02:50:21 字數 988 閱讀 9348

使用分治和遞迴演算法 - 求陣列前k大的所有數(不事先排序)

#include 

using

namespace

std;

void printarray(int arr, int s, int e)

cout

<< endl;

}// note: end 引數 指向最後乙個元素的後一元素

int arrangeright(int arr, int start, int end, int numofbigest)

if (end - i == numofbigest) else

if (end - i > numofbigest) else

if (end - i < numofbigest)

}int main()

; cout

<< sizeof(vec)/sizeof(int) << endl;

int start = arrangeright(vec, 0, sizeof(vec)/sizeof(int), 4);

for (int i = 0; i < 4; i++)

cout

<< endl << "program end ... "

<< endl;

return

0;}

arrangeright函式首先利用類似快速排序把陣列分為兩部分(前部分比key值小,後部分比key值大)

如果是後部分的元素的數量和k相等,後部分正好是所有k大的數

如果是後部分的元素的數量大於k,說明k大的所有數還在後部分之中,繼續遞迴求後部分的元素的k大的所有數(注意:起始位置應該是i+1,因為key值肯定是不在k大的所有元素中)

如果後部分的元素數量小於k,說明k大的所有數一定都在前部分之中,繼續遞迴求前部分的元素的k大的所有數,去掉了後部分,求的問題就轉化為是第(k-後部分元素數量)大的所有數了(注意:同上,因為key值肯定也不在k大的所有元素中)

陣列中前k大的數

問題 程式設計之美 page139.尋找最大的k個數。方法一 通過全排序 快速排序 然後獲取前k個數即位最大的k個數。演算法複雜度 o nlogn 方法二 通過部分排序。選擇排序,氣泡排序 直接獲取前k個最大的數。演算法複雜度o n k 當k比較小的時候可以考慮 方法三 快速排序的變種。前面尋找陣列...

兩個有序陣列中,求所有數中第k個大的數字

include using namespace std 兩個有序陣列中,求所有數中第k個大的數字 int firstkmax int arr1,int arr2,int k,int l1,int l2 i while i 0 j 0 arr1 i arr2 j j return arr1 k cou...

求乙個陣列中出現次數前k種的元素

map fruitcount 建立map物件 for int i 0 i sizeof fruits sizeof fruits 0 i else 缺點 如果map中沒有要插入的這個水果,則需要遍歷兩次map。思路二 只遍歷一次map insert的返回值pair。既然不管是否插入成功,它都能返回我...