堆是一種特殊的完全二叉樹,所有父點都比子結點要小稱最小堆,反之,所有父點都比子結點大的成為最大堆。用堆來排序、刪除、增加效率都比較高。另外用堆來求第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...