堆排序法---题目
题目内容:
實作Max heap的三種操作:push, pop, top。
指令0 x:代表push,將x push進max heap。
指令1 : 代表pop,將最大的數字pop出來,若heap為空則忽略這道指令。
指令2 : 代表top,將最大的數字印出來,若heap為空則忽略這道指令。
输入格式:
本題只有一道測資。
測資第一行為一個數字N,代表接下來有N行指令。每行指令個格式如題目敘述。
所有push的數字皆不相同。
0 < N < 20000
0 < x < 10000000
输出格式:
將所有top指令輸出的數字作加總,最後輸出這個和。
Hint : 注意overflow!
输入样例:
15
1
0 9550684
0 8533293
1
2
2
1
0 505825
0 9809892
0 1484329
0 4958409
0 3788064
0 28006
2
0 2979864
输出样例:
26876478
时间限制:100ms内存限制:128000kb
实现方式一:(堆排序,时间复杂度:O(lgn))
1 #include <stdio.h> 2 int cmd1,cmd2; 3 int count = 0; 4 long long sum = 0; 5 long long a[20000]; 6 7 void push(long long a[]){ 8 a[++count] = cmd2; 9 int index = count; 10 while(index!=1) { 11 int parent = index/2; 12 if(a[parent]<a[index]) { 13 int tmp = a[index]; 14 a[index] = a[parent]; 15 a[parent] = tmp; 16 index = parent; 17 } else 18 break; 19 } 20 return; 21 } 22 23 void pop(long long a[]){ 24 if(count==0) { 25 return; 26 } 27 a[1] = a[count--]; 28 int index = 1; 29 int lchd = 2*index; 30 int rchd = lchd+1; 31 while(lchd<=count) { 32 int chd; 33 if(a[lchd] > a[rchd]) 34 chd = lchd; 35 else 36 chd =rchd; 37 if(a[index]<a[chd]) { 38 int tmp = a[index]; 39 a[index] = a[chd]; 40 a[chd] = tmp; 41 index = chd; 42 lchd = 2*index; 43 rchd = lchd+1; 44 } else 45 break; 46 } 47 return; 48 49 } 50 51 void top(long long a[]){ 52 sum +=a[1]; 53 } 54 55 int main(void){ 56 int n,i; 57 scanf("%d",&n); 58 for(i=0;i<n;i++){ 59 scanf("%d",&cmd1); 60 if(cmd1==0){ 61 scanf("%d",&cmd2); 62 push(a); 63 } 64 65 if(cmd1==1){ 66 pop(a); 67 } 68 if(cmd1==2){ 69 top(a); 70 } 71 } 72 printf("%lld",sum); 73 return 0; 74 }
实现方式二:(时间复杂度:O(nlgn))
1 #include <stdio.h> 2 int cmd1,cmd2; 3 int count = 0; 4 long long sum = 0; 5 long long a[20002]; 6 void HeapAdJust(long long a[],int i,int size){ 7 int l_child = 2*i; 8 int r_child = 2*i+1; 9 int max =i ; 10 int temp; 11 12 if(l_child<=size&&a[l_child]>a[i]){ 13 max = l_child; 14 } 15 if(r_child<=size&&a[r_child]>a[max]){ 16 max = r_child; 17 } 18 if(max != i){ 19 temp = a[i]; 20 a[i] = a[max]; 21 a[max] = temp; 22 HeapAdJust(a,max,size); 23 } 24 } 25 26 void BuildHeap(long long a[],int size){ 27 int i; 28 for(i=size/2;i>=1;i--){ 29 HeapAdJust(a,i,size); 30 } 31 } 32 33 void push(long long a[]){ 34 a[++count] = cmd2; 35 BuildHeap(a,count); 36 } 37 38 void pop(long long a[]){ 39 if(count==0){ 40 return; 41 } 42 a[1] = a[count]; 43 count--; 44 BuildHeap(a,count); 45 return; 46 } 47 48 void top(long long a[]){ 49 sum +=a[1]; 50 } 51 52 int main(void){ 53 int n,i; 54 scanf("%d",&n); 55 for(i=0;i<n;i++){ 56 scanf("%d",&cmd1); 57 if(cmd1==0){ 58 scanf("%d",&cmd2); 59 push(a); 60 } 61 62 if(cmd1==1){ 63 pop(a); 64 } 65 66 if(cmd1==2){ 67 top(a); 68 } 69 } 70 printf("%lld\n",sum); 71 return 0; 72 }

浙公网安备 33010602011771号