Advertisement
Guest User

Untitled

a guest
Jun 25th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.86 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4.  
  5. int parent(int i);
  6. int left(int i);
  7. int right(int i);
  8. void przywroc(int*K, int heap_size, int i);
  9. void buduj(int*K, int heap_size);
  10. int maks(int *K, int n);
  11. int mini(int *K, int n);
  12. void sort_kopcowanie(int*K, int heap_size);
  13. void sort_zliczanie(int*K,int n);
  14.  
  15. int main(){
  16.     int*K = NULL;
  17.     int n=0;
  18.     int x;
  19.     int i;
  20.     char z;
  21.  
  22.     srand (time(NULL));
  23.  
  24.     while(1){
  25.         printf("\n Co chcesz:");
  26.         printf("\n b - buduj");
  27.         printf("\n d - wstaw");
  28.         printf("\n w - wyswietl");
  29.         printf("\n k - sort kopcowanie");
  30.         printf("\n z - sort zlicznanie");
  31.         printf("\n q - zakoncz \n ");
  32.  
  33.         fflush(stdin);
  34.         z = getchar();
  35.         switch(z){
  36.         case 'b' :  buduj(K,n);
  37.                     break;
  38.  
  39.         case 'd' :  /*fflush(stdin);
  40.                     scanf("%d",&x);
  41.                     K = (int*)realloc(K,(n+1)*sizeof(int));
  42.                     *(K+n) = x;
  43.                     n++;
  44.                     break;
  45.                     */
  46.                     n = 10;
  47.                     K = (int*)realloc(K,(n)*sizeof(int));
  48.                     for(i=0; i<n; i++)
  49.                         *(K+i) = rand()%100;
  50.  
  51.         case 'w' :  for(i=0; i<n; i++)
  52.                         printf("%d, ",*(K+i));
  53.                     break;
  54.         case 'k' :  sort_kopcowanie(K,n);
  55.            
  56.                     for(i=0; i<n; i++)
  57.                         printf("%d, ",*(K+i));
  58.                    
  59.                     break;
  60.         case 'z' :  sort_zliczanie(K,n);
  61.            
  62.                     for(i=0; i<n; i++)
  63.                         printf("%d, ",*(K+i));
  64.                    
  65.                     break;
  66.        
  67.         case 'q' : return 0;
  68.         }
  69.     }
  70. }
  71.  
  72. int parent(int i){
  73.     return (i-1)/2;
  74. }
  75.  
  76. int left(int i){
  77.     return 2*i+1;
  78. }
  79.  
  80. int right(int i){
  81.     return 2*i+2;
  82. }
  83.  
  84. void przywroc(int*K, int heap_size, int i){
  85.     int temp;
  86.     int r = right(i);
  87.     int l = left(i);
  88.     int max;
  89.    
  90.     if(l<heap_size && *(K+l)>*(K+i))
  91.         max = l;
  92.     else
  93.         max = i;
  94.     if(r<heap_size && *(K+r)>*(K+max))
  95.         max = r;
  96.  
  97.     if(max!=i){
  98.         temp = *(K+i);
  99.         *(K+i) = *(K+max);
  100.         *(K+max) = temp;
  101.         przywroc(K,heap_size,max);
  102.     }
  103. }
  104.  
  105. void buduj(int*K, int heap_size){
  106.     int k;
  107.  
  108.     for(k=heap_size/2-1;k>=0;k--)
  109.         przywroc(K,heap_size,k);
  110. }
  111.  
  112. void sort_kopcowanie(int*K, int heap_size){
  113.     int i,temp;
  114.  
  115.     for(i=heap_size-1;i>0;i--){
  116.         buduj(K,heap_size);
  117.         temp = *K;
  118.         *K = *(K+i);
  119.         *(K+i) = temp;
  120.         heap_size = heap_size - 1;
  121.     }
  122. }
  123.  
  124. int maks(int *K,int n){
  125.     int max,i;
  126.    
  127.     max = *K;
  128.     for(i=0;i<n;i++){
  129.         if(max<*(K+i))
  130.             max = *(K+i);
  131.     }
  132.  
  133.     return max;
  134. }
  135.  
  136. int mini(int *K,int n){
  137.     int mini,i;
  138.    
  139.     mini = *K;
  140.     for(i=0;i<n;i++){
  141.         if(mini>*(K+i))
  142.             mini = *(K+i);
  143.     }
  144.  
  145.     return mini;
  146. }
  147.  
  148. void sort_zliczanie(int*K,int n){
  149.     int k1,k2,k,i;
  150.     int*B = NULL,*C = NULL;
  151.    
  152.     k1 = maks(K,n);
  153.     k2 = mini(K,n);
  154.     k = k1 - k2;
  155.  
  156.     C = (int*)realloc(C,(k+1)*sizeof(int));
  157.     for(i=0;i<k+1;i++)
  158.         *(C+i)=0;
  159.     for(i=0;i<n;i++)
  160.         *(C+*(K+i)-k2) = *(C+*(K+i)-k2) + 1;
  161.     for(i=1;i<k+1;i++)
  162.         *(C+i)=*(C+i) + *(C+(i-1));
  163.    
  164.     B = (int*)realloc(B,n*sizeof(int));
  165.  
  166.     for(i=0;i<n;i++){
  167.         *(B+*(C+*(K+i)-k2)-1) = *(K+i);
  168.         *(C+*(K+i)-k2) = *(C+*(K+i)-k2) - 1;
  169.     }
  170.     for(i=0;i<n;i++)
  171.         *(K+i) = *(B+i);
  172.         free(B);
  173.         free(C);
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement