資料結構 排序 第K大數,第K小數(堆)

2021-08-25 16:44:19 字數 1221 閱讀 5682

堆是一種特殊的完全二叉樹,所有父點都比子結點要小稱最小堆,反之,所有父點都比子結點大的成為最大堆。用堆來排序、刪除、增加效率都比較高。另外用堆來求第k大數和第k小數都比較方便。只需要建立乙個大小為k的堆,堆頂就是要求的第k大或第k小。

例如:有5個數,要求第3小的數。首先任取三個數,例如前三個建立最大堆,然後從第4個數開始與堆頂比較,若比堆頂大,那麼這個數就不要,若比堆頂小就和堆頂交換,重新調整為最大堆。後面的數照此迴圈知道結束,此時堆頂就是第3小數。

**後面↓:

#includeusing namespace std;

const int max = 10000;

int h[max];

int n, k;

void swap(int i, int j)

//向下調整

void siftsort(int x)

//若父親點比孩子點小

if (t != x)

else

flag = 1; }}

//與堆頂判斷大小

void setpop(int x)

}int main()

else//判斷是否換堆頂

setpop(i);

} cout << h[1] << endl;

return 0;

}

這裡堆排序我用的是建立最大堆,建立好的堆,最大的數在堆頂,但是我們想要的是從小到大排序,希望你最大的數是在最後。

因此就採用h[1]和h[n]交換,然後h[1]再向下調整位置,保持著最大堆的特性。然後將堆的大小減1,即n--,再交換h[1]和h[n],如此迴圈直到堆的大小變成1;

**:↓

#includeusing namespace std;

int a[30], n = 1;

int num;

//交換元素

void swap(int i, int j)

//向下調整

void siftdown(int i)

if (t != i)//若父親點比孩子點小

else

flag = 1;//父點比孩子都小,迴圈結束 }}

//建立堆,從非葉結點開始,非葉結點號是n/2

void create()

//堆排序

void heapsort()

}int main()

牛客 第k小數 線性尋找第 k 小數

題目大意 給出長度為 n 的數列 a 要求找到第 k 小的數 題目分析 因為資料給的足夠大,所以約束就是必須線性完成操作,stl 中的 nth element 函式可以完美實現操作,算是學到了一波,格式 nth element a.begin a.begin k a.end 那麼 a k 就是第 k...

求第k小數

求第k小數,無非就是考查排序,請參考我最新的博文吧求第k小數 直接使用priority queue,在網上看到許多使用快排來求第k小數都是認為第k小就是排好序陣列中第k個元素,但是如果陣列中有相同的元素呢,例如 1,2,2,2,3,5 認為第三小是3還是2呢?我刷題時遇到的是認為是3。沒有想到什麼好...

查詢第K小數

查詢乙個陣列的第k小的數,注意同樣大小算一樣大。如 2 1 3 4 5 2 第三小數為3。輸入描述 輸入有多組資料。每組輸入n,然後輸入n個整數 1 n 1000 再輸入k。輸出描述 輸出第k小的整數。輸入例子 6 2 1 3 5 2 2 3 輸出例子 3 import j a.util.array...