堆排序法 題目

2022-03-14 11:23:28 字數 2155 閱讀 1241

題目內容:

實作max heap的三種操作:push, pop, top。

指令0 x:代表push,將x push進max heap。

指令1 : 代表pop,將最大的數字pop出來,若heap為空則忽略這道指令。

指令2 : 代表top,將最大的數字印出來,若heap為空則忽略這道指令。

輸入格式:

本題只有一道測資。

所有push的數字皆不相同。

0 < n < 20000

0 < x < 10000000

輸出格式:

將所有top指令輸出的數字作加總,最後輸出這個和。

hint : 注意overflow!

輸入樣例:151

0 9550684

0 853329312

210 505825

0 9809892

0 1484329

0 4958409

0 3788064

0 28006

20 2979864

輸出樣例:

26876478

時間限制:100ms記憶體限制:128000kb

實現方式一:(堆排序,時間複雜度:o(lgn))

1 #include 2

intcmd1,cmd2;

3int count = 0;4

long

long sum = 0;5

long

long a[20000];6

7void push(long

long

a) else

18break;19

}20return;21

}2223void pop(long

long

a)27 a[1] = a[count--];

28int index = 1;29

int lchd = 2*index;

30int rchd = lchd+1;31

while(lchd<=count) else

45break;46

}47return;48

49}5051

void top(long

long

a)54

55int main(void)64

65if(cmd1==1)68

if(cmd1==2)71

}72 printf("

%lld

",sum);

73return0;

74 }

實現方式二:(時間複雜度:o(nlgn))

1 #include 2

intcmd1,cmd2;

3int count = 0;4

long

long sum = 0;5

long

long a[20002];6

void heapadjust(long

long a,int i,int

size)

15if(r_child<=size&&a[r_child]>a[max])

18if(max !=i)24}

2526

void buildheap(long

long a,int

size)31}

3233

void push(long

long

a)37

38void pop(long

long

a)42 a[1] =a[count];

43 count--;

44buildheap(a,count);

45return;46

}4748void top(long

long

a)51

52int main(void)61

62if(cmd1==1)65

66if(cmd1==2)69

}70 printf("

%lld\n

",sum);

71return0;

72 }

堆排序法(Java C C 實現)

堆排序是利用堆這種資料結構而設計的一種排序演算法。時間複雜度為 o n lg n 介紹堆排序前,我們先介紹一下堆的相關概念,如果你對堆的概念還不熟悉的話可以看看。除最底層外,該樹是完全充滿的,且是從左到右填充。樹的根結點是 a 1 若某一結點下標為 i,則很容易得到它的父節點為 i 2,左子結點為 ...

歸併排序法 題目

題目內容 在乙個n個數字的序列s裡,當s i s j 且 i j的時候,我們說 i j 是乙個逆序數對。hint 利用歸併排序法計算乙個序列裡有多少逆序數對。hint 思考一下在merge的過程,怎麼找到答案 hint 直接使用兩層迴圈來找答案的話會超過系統時間限制。輸入格式 只有一筆測資,第一行為...

分治法 快速排序 歸併排序 堆排序

十種常見排序演算法可以分為兩大類 非線性時間比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。0.2...