您好,登錄后才能下訂單哦!
輸入n個整數,找出其中最小的k個數
解法1:需要修改輸入的數組,基于partition快速排序來做,時間復雜福O(N)
分析:基于數組的第k個元素來調整,使的比第k個數大的所有數字放到數組的右邊,這樣,數組左邊k個就是最小的k個數字
void GetLestNumber(int *input, int n, int *output, int k) { if (input == NULL || output == NULL || k > n || n <= 0 || k <= 0) return; int start = 0; int end = n - 1; int index = Partition(input, n, start, end); while (index != k - 1) { if (index > k - 1) { end = index - 1; index = Partition(input, n, start, end); } else { start = index + 1; index = Partition(input, n, start, end); } } for (int i = 0; i < k; ++i) { output[i] = input[i]; } }
解法二:
分析:先創建一個大小為k的數據容器來存儲最小的k個數字,接著每次從輸入的n個整數中讀入一個數,如果容器中少于k個數則直接放,若大于則表示容器以滿,此時找出容器中最大值,然后拿輸入的值和最大值比較,若待插入的數小于最大值,則直接替換。
最大堆的結構每次可以在O(1)得到最大值,但需要o(logk)時間來完成刪除及插入
紅黑樹同上,但是代碼簡于大堆
void GetLestNumber(int *input, int n, int *output, int k) { if (input == NULL || output == NULL || k > n || n <= 0 || k <= 0) return; int start = 0; int end = n - 1; int index = Partition(input, n, start, end); while (index != k - 1) { if (index > k - 1) { end = index - 1; index = Partition(input, n, start, end); } else { start = index + 1; index = Partition(input, n, start, end); } } for (int i = 0; i < k; ++i) { output[i] = input[i]; } } 解法二: 分析:先創建一個大小為k的數據容器來存儲最小的k個數字,接著每次從輸入的n個整數中讀入一個數,如果容器中少于k個數則直接放,若大于則表示容器以滿,此時找出容器中最大值,然后拿輸入的值和最大值比較,若待插入的數小于最大值,則直接替換。 最大堆的結構每次可以在O(1)得到最大值,但需要o(logk)時間來完成刪除及插入 const int N = 1000; const int k = 10; void AdjustDown(int *a, int size, int parent) { int child = (parent - 1) / 2; while (child < size) { if (child+1<size&&a[child]>a[child + 1]) child++; if (a[child]>a[parent]) { swap(a[child], a[parent]); parent = child; child = (parent - 1) / 2; } else break; } } void GetTopK(int*a) { assert(k < N); int top[k]; for (int i = 0; i < k; i++) { top[i] = a[i]; } for (int i = (k - 2) / 2; i >= 0; i++) { AdjustDown(top, k, i); } for (int i = N-k-1; i < N; i++) { if (a[i]>top[0]) { top[0] = a[i]; AdjustDown(top, k, 0); } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。