使用分治和遞迴演算法 - 求陣列前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。既然不管是否插入成功,它都能返回我...