找出最小的k個數

2022-07-24 10:18:11 字數 1605 閱讀 3472

•已知陣列中的n個正數,找出其中最小的k個數。

•例如(4、5、1、6、2、7、3、8),k=4,則最小的4個數是1,2,3,4

•要求:

–高效;

–分析時空效率

•擴充套件:能否設計出適合在海量資料中實現上述運算?

方法一:

1

//利用最大根堆實現最小k個節點2//

最大根堆特點:每個節點都比他左右孩子要大3//

調整最大堆的時間複雜度為o(lnk),因此該演算法(問題)時間複雜度為o(nlnk).4//

思路:通過數組建堆5//

規律:第i個節點的左孩子為2i+1,右孩子為2i+2

67 #include 8

9using

namespace

std;

10int

n;11

intk;

12int*stack;

13void

initstack();

14void restack(int

parent);

15int basejudge(int

parent);

16int maxnode(int parent, int

lc);

17int maxnode(int parent, int lc, int

rc);

1819

//將最大數換給父節點(右子不存在) 返回替換前的最大值位置 未替換返回0

20int maxnode(int parent, int

lc)

27return0;

28}2930

//將最大數換給父節點(左右子都存在) 返回替換前的最大值位置 未替換返回0

31int maxnode(int parent, int lc, int

rc)

39else44}

45return0;

46}4748

//初始化堆

49void

initstack() 54}

5556

//判斷函式

57int basejudge(int

parent)

65else68}

6970

71//

遞迴判斷

72void restack(int

parent)

7677

78int main(void

) 95

}96 cout << "

最小k個數:";

97for (int i = 0; i < k; i++) cout << stack[i] << "";

98 cout <99return0;

100}

101102

/*103

樣例輸入:

1044

10520

1067 5 1 10 3

1076 11 4 7 9

10825 13 47 6 20

10913 47 68 32 1

110111

樣例輸出:

1124 3 1 1

113*/

找出陣列中最小的k個數

leetcode 面試題40.最小的k個數 快速排序,時間複雜度為nlogn,然後前k個元素就是最小的k個數 class solution 原理也是快速排序的原理,只不過增加了停止條件。不用完全排序而已。class solution int label quicksort arr,0,arr.len...

程式設計題目 找出最小的k個數

找出最小或者最大的幾個數我使用的是堆排序,效率為0 nlgn 構建小頂堆返回末尾的k個數 或者 構建大頂堆返回前k個數 1 usr bin env python323 defheap sort ary,num 4def siftdown ary,e,begin,end 5 i,j begin,beg...

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...