題目:在n個不相等的整數中找出最大的第k個數(n>k)。
思路:首先,用前k個整數構造容量為k的最小堆。然後,將後n-k個整數依次與堆頂元素比較,若比堆頂元素大,則替換堆頂元素並調整最小堆結構;反之,則繼續比較下乙個整數。最終,最小堆儲存最大的k個數,其堆頂元素即為所求。
**:
1 #include 2 #include 3 #include 4 #include 5 #include 67#define n 90
8#define k 13910
11void heapadjust (int *heap, int beginidx, int
endidx);
12void heapconstruct (int *heap);
1314
void setdata (int *data);
15void showdata (int *data);
1617
int main (int argc, char **argv)
1833}34
35 printf("
the kth biggest number: %d\n
", h[1
]);36
return0;
37}3839
void heapadjust (int *heap, int beginidx, int
endidx)
4051
else
5255
if (data >heap[tmp])
5660
else
6164
}65 heap[current] =data;66}
6768
void heapconstruct (int *heap)
6975}76
77void setdata (int *data)
7890 bdata[data[i]] = true;91
}92delete
bdata;93}
9495
void showdata (int *data)
96101 puts(""
);102 }
時間複雜度:o((n-k+1)*k*lgk).
堆排序及其乙個應用
今天為什麼會想寫一些關於堆排序的東西?因為在github中看到了乙個july的repository的演算法之道系列文章 中乙個找出n個數中最大 小 的前k個數?我就開始想了,文中列舉了很多中解決辦法,我也想了幾種,大致差不多,但堆排序那裡我有點想法,或者說想寫詳細一點。首先,我感覺july文章中最大...
排序問題 堆排序
堆排序是基於優先佇列 使用基於陣列的大頂堆或者小頂堆 的排序,是乙個 建堆 刪除 調整 刪除 調整 的過程。在 個元素組成的二叉堆中,建堆的時間複雜度是o n 之後執行n次刪除堆頂元素和調整 時間複雜度為o logn 將每次刪除的元素一次放入乙個序列中便得到了乙個有序數列,時間複雜度為o n o n...
堆排序問題
堆,本質上是乙個完全二叉樹,可以用陣列來表示,這樣非常的方便。最大堆 從陣列的第一號開始排,a 0 為空,方便計算。那麼ai a2i ai a 2i 1 那麼就是最大堆 最小堆 從陣列的第一號開始排,a 0 為空,方便計算。那麼ai a2i ai a 2i 1 那麼就是最小堆。ifndef dui ...