查詢最小的k個元素

2021-06-27 08:25:11 字數 1393 閱讀 2850

題目: 輸入n個整數,輸出其中最小的k個數

例如: 1 2 3 4 5 6 7 8 這8個數字,則最小的4個數字為1,2,3,4,

第一種:直接對其先排序,再取頭幾個數 這樣最快是nlogn(快排或者堆排)

#include using namespace std; 

void partsort(int a, int l, int r);

void quicksort(int a, int n)

void partsort(int a, int l, int r)

while( i < j && a[i] < x)i++;

if( i < j )

}a[i] = x;

partsort(a,l,i-1);

partsort(a,i+1,r); }}

int main()

; quicksort(a,7);

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

return 0;

}

這裡用快排,為nlogn

第二種: 用insert-sort   時間複雜度為(kn),即取前幾個數就對找前幾個數

void insertsort(int a, int n, int k)   //k為前n個數

}

第三種:

是最快的了  n+klog(n)  建立最小堆堆用o(n)的時間複雜度  取k-1次最頂上數

#include using namespace std;

void maxheapdown(int a, int i, int n)

a[i] = temp;

}void makemaxheap(int a, int n)

}void maxheapsort(int a, int n) }

int minheapdown(int a, int i, int n)

a[i] = temp;

}int makeminheap(int a, int n)

}void minheapsort(int a, int n)

}/*本題的解決方法*/

void findkminnum(int a,int n,int k) }

int main()

;// maxheapsort(a,8);

// minheapsort(a,8);

findkminnum(a,8,4);

//for(int i = 0; i < 8; i++)

// cout << a[i] << endl;

return 0;

}

從頭到尾再複習了一遍堆排序。

查詢最小的k個元素

題目 輸入n個整數,輸出其中最小的k個。演算法思想,要是將n個數排序然後輸出前k個,方法很簡單,但計算量比較大,為o nlogn 要是新建乙個有k個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...

查詢最小的k個元素

查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。1 輸入元素,並排序 2 輸出前k個元素 排序 採用高效的排序方法,如 快速排序,歸併排序等 方法一 採用最簡單的方法 include include in...

查詢最小的k個元素

題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和這8個數字,則最小的4個數字為1,2,3和4。分析 這道題最簡單的思路莫過於把輸入的n個整數排序,這樣排在最前面的k個數就是最小的k個數。只是這 種思路的時間複雜度為o nlogn 我們試著尋找更快的解決思路。我們可以開闢乙...