在n個亂序的陣列中找第k大的數
思路:
類似於快速排序,執行一次快速排序之後,每次只選擇一部分繼續執行快速排序,直到找到第k大個元素為止,這個元素在陣列位置後面的元素即為所求。
時間複雜度:o(n)
利用快排的思想,從陣列arr中隨機找出乙個元素x,把陣列分成兩部分arr_a和arr_b。
arr_a中的元素比x大,arr_b中的元素比x小。
這個時候分為兩種情況:
1.arr_a中的元素小於k,則arr_b中第k-arr_a.length個元素即為第k大數。
2.arr_a中的元素大於等於k,則返回arr_a中第k大數
public
class quick_find
public
static
void
find_k(int k,int arr,int low,int high)else
if(temp>k-1)else
} public
static
void
main(string args) ;
find_k(2,arr,0,arr.length-1);
} }
無序陣列中找第K個的數
題目分析 也就是從小往大排,第k小那個數。方法1 排序 nlogn 方法2 利用堆 nlogk 首先將前k個元素構建最大堆,堆頂是前k個元素中第k小的元素。這步複雜度klogk 遍歷剩餘元素 這步複雜度 n k logk 如果新元素 堆頂 堆頂不可能是第k大元素 移除堆頂 將新元素插入堆 否則 新元...
求亂序陣列中第K大的值
投機取巧用函式進行處理,沒有從演算法角度思考 編譯成功60 還得再想想哪些案例沒有實現 include include include using namespace std int main 輸入為首行亂序數列,第二行為k值 int num vectorv1 while cin num int k...
找陣列中第k大的數
但會修改陣列中的資料,所以這裡有新的不修改資料的思路 1 用multiset實現自動排序,大小為k,每個數與set中最大的數比較,如果小於則替換。2 可以用最大堆來實現,方法類似上面的。關鍵是看 注釋在下面。時間複雜度為 include include includeusing namespace ...