堆排序 GPLT L2 012 關於堆的判斷

2022-03-11 14:12:24 字數 1440 閱讀 8308

分析:這題看起來非常唬人,其實不難。。。。。四個judge基本沒啥差,就是輸入稍微注意一下,只要知道怎麼構造乙個堆是非常水的一道題目

堆的話就是二叉樹,兒子的值一定不小於父親的值,左子樹是父親節點的2倍,右子樹是父親節點2倍+1

用的是向上浮動的方法構造,聽大牛說「必須注意,因為題目要求按照插入的順序建立,所以是邊插入邊調整的,必須用向上調整,每次輸入乙個數之後就將它向上調整。(兩者建立出來的二叉樹不同)而不能採用先轉換為二叉樹的方式再向下調整。」

不過具體原因我也不知道。。。。。

上**吧

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

const

int inf=1

<<30;5

const

double pi=acos(-1);6

const

int mod=998244353;7

const

int maxn=1050;8

const

int maxm=6300;9

int a[maxn];int

n,m;

10void upadjust(int

i)else19}

20}21void judge1(int

x)25

void judge2(int x,int

y)31

if(idxa>idxb) swap(idxa,idxb);//

保證左邊的是a,接下來好判斷

32if(idxa%2==0&&idxb-idxa==1)printf("

t\n"

);33

else printf("

f\n"

); 34}35

void judge3(int x,int

y)41

if(idxa*2==idxb||idxa*2==idxb-1)printf("

t\n"

);42

else printf("

f\n"

); 43}44

void judge4(int x,int

y)50

if(idxb*2==idxa||idxb*2==idxa-1)printf("

t\n"

);51

else printf("

f\n"

); 52}53

intmain()

59char c[100

];60

intx,y;

61for(int i=0;i)

67else

73else

78else82}

83}84}

85return0;

86 }

排序 4 堆排序

將待排序的序列構成乙個大頂堆。此時,序列的最大值就是堆頂的根結點。將它移走 就是,將其與堆陣列的末尾元素交換,此時末尾的元素就是最大值 然後將剩餘的n 1個序列重新構成乙個堆,如此反覆。其中關鍵問題 1 如何將無序序列構成乙個堆 2 輸出堆頂元素後,如何調整公升序元素為乙個堆 4.堆排序 堆調整 v...

排序二 堆排序

子結點的鍵值或索引總是小於 或者大於 它的父節點。堆通過一維陣列實現。在起始陣列為 0 的情形中 父節點i的左子節點在位置 2 i 1 父節點i的右子節點在位置 2 i 2 子節點i的父節點在位置 floor i 1 2 堆中的最大值總是位於根節點。堆中定義以下幾種操作 1 最大堆調整 max he...

排序七 堆排序

時間複雜度 最好 o n o n 平均o n o nlogn 最差o n o nlogn 空間複雜度 o n o 1 穩定性 不穩定 堆 順序儲存的完全二叉樹,其每個結點均小於等於或大於等於其子節點。小根堆 每個結點元素的值都小於等於其子節點元素的值的堆。s i s 2 i 1 s i s 2 i ...