乙個堆排序問題

2021-09-07 07:40:24 字數 1151 閱讀 3920

題目:在n個不相等的整數中找出最大的第k個數(n>k)。

思路:首先,用前k個整數構造容量為k的最小堆。然後,將後n-k個整數依次與堆頂元素比較,若比堆頂元素大,則替換堆頂元素並調整最小堆結構;反之,則繼續比較下乙個整數。最終,最小堆儲存最大的k個數,其堆頂元素即為所求。

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7#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 ...