fork download
  1. //INCREASE KEY
  2.  
  3. #include <stdio.h>
  4. #include<math.h>
  5. int N;
  6. void printArr(int *a){
  7. printf("\n");
  8. for(int i=0;i<N;i++)
  9. printf("%d ",a[i]);
  10. }
  11.  
  12. void swap(int *a,int p,int q){
  13. int temp=a[p];
  14. a[p]=a[q];
  15. a[q]=temp;
  16. }
  17.  
  18. void max_heapify(int a[],int i){
  19. int large=i;
  20. int left=2*i+1;
  21. int right=2*i+2;
  22. if(left<N && a[large]<a[left])
  23. large=left;
  24. if(right<N && a[large]<a[right])
  25. large=right;
  26.  
  27. if(large!=i){
  28. swap(a,large,i);
  29. max_heapify(a,large);
  30. }
  31.  
  32. }
  33.  
  34. void Build_Heap(int a[]){
  35.  
  36. for(int i=N/2;i>=0;i--){
  37. max_heapify(a,i);
  38. }
  39. }
  40. int getParent(int i){
  41. if(i%2==0)return i/2-1;
  42. else return i/2;
  43. }
  44.  
  45. void increaseKey(int *a,int i,int key){
  46. if(key<a[i]){
  47. printf("\nkey is less than existing value\n");
  48. return;
  49. }
  50. a[i]=key;
  51. int parent=getParent(i);
  52. while(i>0 && a[parent]<a[i]){
  53. swap(a,i,parent);
  54. i=parent;
  55. parent=getParent(i);
  56.  
  57. }
  58. }
  59. int main(void) {
  60. int a[]={20,1,200,490,5,678,44,2,7,8,11,2,3000};
  61. N=sizeof(a)/sizeof(int);
  62. printArr(a);
  63. Build_Heap(a);
  64. printArr(a);
  65.  
  66. increaseKey(a,10,7777);
  67. printArr(a);
  68. return 0;
  69. }
  70.  
Success #stdin #stdout 0s 9432KB
stdin
Standard input is empty
stdout
20 1 200 490 5 678 44 2 7 8 11 2 3000 
3000 490 678 7 11 200 44 2 1 8 5 2 20 
7777 3000 678 7 490 200 44 2 1 8 11 2 20