/* Algorithm written personally: Priority Queue coded by [BUPT]-aswmtjdsj time:2010-08-18 @915 */ #include <iostream> #include <cstring> #include <cmath> #include <cstdio> #include <cctype> #include <cstdlib> #include <algorithm> #include <vector> #include <ctime> #define left(x) (x << 1) #define right(x) ((x << 1) + 1) #define parent(x) (x >> 1) #define MIN -9999999 #define MAX 9999999 /* * time(0)'s return value is * a number approximately near to 1e9 */ using namespace std; typedef long long ll; const double eps=1e-7; void MAX_HEAPIFY(int * a,int i,int n) { int l,r,largest; l = left(i); r = right(i); if(l <= n && a[l] > a[i]) largest = l; else largest = i; if(r <= n && a[r] > a[largest]) largest = r; if(largest != i) { swap(a[i],a[largest]); MAX_HEAPIFY(a,largest,n); } } void BUILD_MAX_HEAP(int *a,int n) { for(int i = n >> 1;i >= 1;i--) MAX_HEAPIFY(a,i,n); } int HEAP_MAXIMUM(int *a) { return a[1]; } int HEAP_EXTRACT_MAX(int *a,int &n)//there are some commands to n,so it may be changed... { if(n < 1) { printf("ERROR : HEAP UNDERFLOW!!/n"); return -1; } int maxn = a[1]; a[1] = a[n--]; //assign and self - substract MAX_HEAPIFY(a,1,n); return maxn; } void HEAP_INCREASE_KEY(int *a,int i,int key) { if(key < a[i]) { printf("ERROR : NEW KEY IS SMALLER THAN CURRENT KEY!!!/n"); return ; } a[i] = key; //because it's easy to hold HEAP's property,so we don't need to use MAX_HEAPIFY here.. //and these commands is in the upside-down order towards the MAX_HEAPIFY..so we use another command while(i > 1 && a[parent(i)] < a[i]) { swap(a[i],a[parent(i)]); i = parent(i); } } void HEAP_DECREASE_KEY(int *a,int i,int key,int n) { if(key > a[i]) { printf("ERROR : NEW KEY IS LARGER THAN CURRENT KEY!!!/n"); return ; } a[i] = key; //because it's easy to hold HEAP's property,so we don't need to use MAX_HEAPIFY here.. //and these commands is in the upside-down order towards the MAX_HEAPIFY..so we use another command MAX_HEAPIFY(a,i,n); } void MAX_HEAP_INSERT(int *a,int key,int &n)//need changes... { a[ ++n] = MIN;//++ and assignment... //use HEAP_INCREASE_KEY HEAP_INCREASE_KEY(a,n,key); } void MAX_HEAP_DELETE(int *a,int i,int &n) { HEAP_INCREASE_KEY(a,i,MAX); swap(a[1],a[n--]); MAX_HEAPIFY(a,1,n); } int main() { int l,*arr; printf("Priority Queue Version 0.1/nCoded by BUPT-aswmtjdsj@915/nCopy Rights Reserved.../n"); printf("Please input the heap-size>"); while(scanf("%d",&l) != EOF) { int i; arr = new int[l + 1]; printf("Building heap..../n"); for(i = 1;i <= l;i++) { arr[i] = rand() % (int)(time(0) / 1e8 * 3); } BUILD_MAX_HEAP(arr,l); printf("The HEAP is : /n"); for(i = 1;i <= l;i++) { printf("%d ",arr[i]); } printf("/n"); char str[20]; printf("Please input the command((I)nsert,(A)dd,(D)elete),(S)ubstract,(M)ax,(E)xtract>"); while(scanf("%s",str) != EOF) { if(!strcmp(str,"Insert") || !strcmp(str,"I")) { int key; printf("Please input the key number you want to insert>"); scanf("%d",&key); MAX_HEAP_INSERT(arr,key,l); } else if(!strcmp(str,"Delete") || !strcmp(str,"D")) { int p; printf("Please input the order number you want to delete>"); scanf("%d",&p); MAX_HEAP_DELETE(arr,p,l); } else if(!strcmp(str,"Add") || !strcmp(str,"A")) { int p; printf("Please input the order number you want to add>"); scanf("%d",&p); int key; printf("please input the number you want to add the Num.%d to>",p); scanf("%d",&key); HEAP_INCREASE_KEY(arr,p,key); } else if(!strcmp(str,"Substract") || !strcmp(str,"S")) { int p; printf("Please input the order number you want to substract>"); scanf("%d",&p); int key; printf("please input the number you want to substract the Num.%d to>",p); scanf("%d",&key); HEAP_DECREASE_KEY(arr,p,key,l); } else if(!strcmp(str,"Max") || !strcmp(str,"M")) { int p; printf("The MAXIMUM number in the HEAP> %d/n",HEAP_MAXIMUM(arr)); } else if(!strcmp(str,"Extract") || !strcmp(str,"E")) { int p,d = HEAP_EXTRACT_MAX(arr,l); if(d == -1) printf("ERROR : THE HEAP IS EMPTY./n"); else printf("The MAXIMUM number in the HEAP> %d/n",d); } else printf("ERROR : WRONG COMMAND!!!/n"); printf("After the command,the HEAP now is:/n"); for(i = 1;i <= l;i++) { printf("%d ",arr[i]); } printf("/n"); printf("Please input the command((I)nsert,(A)dd,(D)elete),(S)ubstract,(M)ax,(E)xtract>"); } delete []arr; printf("Please input the heap-size>"); } return 0; }