在O n 時間內找出最小的k個元素

2021-06-15 01:23:52 字數 880 閱讀 5167

思想:1.用大頭堆實現 2.類似快速排序實現

1.用大頭堆實現

《程式設計師面試一百題》解法

2.類似快速排序實現

//程式猴

#include "stdafx.h"

#include #include #include #include #include using namespace std;

//每次將陣列劃分為兩部分,再在滿足條件的一部分裡找到第k小的數,它前面的數就是最小的k個數

void findkleastnums(int data,int lower,int upper,int least_size)

while (idata[lower]);

if (i>j)

break;

tmp = data[i];

data[i] = data[j];

data[j] = tmp;

} tmp = data[lower];

data[lower] = data[j];

data[j] = tmp;

if (jleast_size)

return;

}int main(void)

; printf(" 原陣列中元素:");

int i = 0;

while(i<10)

findkleastnums(data,0,9,5);

printf("\n調整後最小的5個:");

for (i = 0;i<5;i++)

return 0;

}

執行結果

在O n 時間內查詢陣列內第k小的數

前一陣子做作業,看到了這個,要求在 o n 時間內查詢前 k 小的 k 個數,給出的提示是,先在 o n 時間內查詢到第 k 小的數.由此想到,此前一直用 的 sort 函式,排完序後找下標為 k 1 的那個數,卻從來沒有考慮過具體的 實現.結合前一陣子學習的快速排序演算法,大致對此有了新的認識.首...

選擇問題 線性時間內找到序列的第k小的元素

選擇問題 在序列中按順序找到某個元素。這可以用排序方法做到,即先排個序,在找到指定元素,但是這樣就按最快的堆排序 合併排序啥的都得是o nlgn 數量級的,這裡採取的方法可以在期望為o n 的時間內完成。具體的實現方式如下 int select int a,int begin,int end,int...

在指定的時間內點選某元素達到一定的次數後才觸發事件

工作需要,要做乙個點選某一元素,在規定的時間內,點選次數達到一定值時,才觸發其他事件。剛開始是一臉懵逼,思緒混亂,首先想到了使用定時器,後來繞來繞去,始終沒有解決,在跟安卓開發的同事交流一番後,便產生了乙個更加簡單的方法,不使用定時器。大致思路是這樣的 初始時,給乙個變數clicknum,值為0,用...