•已知陣列中的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 ...