Patey

Untitled

Nov 10th, 2021
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6.  
  7. int N, count = 1;
  8. int pasi;
  9. void swap(int* a, int* b)
  10. {
  11.     int t = *a;
  12.     *a = *b;
  13.     *b = t;
  14. }
  15. void citire(int a[], int n)
  16. {
  17.     int i;
  18.     printf("Dati cele %d numere: ", n);
  19.     for (i = 0; i < n; i++)
  20.         scanf("%d", &a[i]);
  21. }
  22. void afisare(int a[], int n)
  23. {
  24.     int i;
  25.     for (i = 0; i < n; i++)
  26.         printf("%d ", a[i]);
  27.     printf("\n");
  28. }
  29. void interschimbare(int a[], int n)
  30. {
  31.     int i, j;
  32.     for (i = 0; i < n - 1; i++) {
  33.         for (j = i + 1; j < n; j++) {
  34.             if (a[i] > a[j]) {
  35.                 int aux = a[i];
  36.                 a[i] = a[j];
  37.                 a[j] = aux;
  38.             }
  39.         }
  40.         printf("Etapa %d: ", count);
  41.         count++;
  42.         afisare(a, n);
  43.     }
  44. }
  45.  
  46. void insertie(int a[], int n)
  47. {
  48.     int i, j, aux;
  49.     for (i = 1; i < n; i++)
  50.     {
  51.         aux = a[i];
  52.         j = i - 1;
  53.         while (j >= 0 && a[j] > aux)
  54.         {
  55.             a[j + 1] = a[j];
  56.             j = j - 1;
  57.         }
  58.  
  59.         a[j + 1] = aux;
  60.         printf("Etapa %d: ", i);
  61.         afisare(a, n);
  62.     }
  63. }
  64.  
  65. int cautareBinara(int a[], int cautat, int s, int d)
  66. {
  67.     if (d <= s)
  68.     {
  69.         if (cautat > a[s])
  70.             return (s + 1);
  71.         else
  72.             return s;
  73.     }
  74.     int m = (s + d) / 2;
  75.     if (cautat == a[m])
  76.         return m + 1;
  77.     if (cautat > a[m])
  78.         return cautareBinara(a, cautat, m + 1, d);
  79.     return cautareBinara(a, cautat, s, m - 1);
  80. }
  81.  
  82. void insertieBinara(int a[], int n)
  83. {
  84.     int i, j, aux, loc;
  85.     for (i = 1; i < n; i++)
  86.     {
  87.         j = i - 1;
  88.         aux = a[i];
  89.         loc = cautareBinara(a, aux, 0, j);
  90.         while (j >= loc)
  91.         {
  92.             a[j + 1] = a[j];
  93.             j--;
  94.         }
  95.         a[j + 1] = aux;
  96.         printf("\nEtapa %d: ", i);
  97.         afisare(a, n);
  98.     }
  99. }
  100.  
  101. void selectie(int a[], int n)
  102. {
  103.     int i, j, k_min, aux;
  104.     for (i = 0; i < n - 1; i++)
  105.     {
  106.         k_min = i;
  107.         aux = a[i];
  108.         for (j = i + 1; j < n; j++)
  109.             if (a[j] < a[k_min])
  110.             {
  111.                 k_min = j;
  112.                 aux = a[k_min];
  113.             }
  114.         a[k_min] = a[i];
  115.         a[i] = aux;
  116.         printf("\nEtapa %d: ", i + 1);
  117.         afisare(a, n);
  118.     }
  119. }
  120. void selectiePerformanta(int a[], int n)
  121. {
  122.     int i, j, k_min, aux;
  123.     for (i = 0; i < n - 1; i++)
  124.     {
  125.         k_min = i;
  126.         for (j = i + 1; j < n; j++)
  127.             if (a[j] < a[k_min])
  128.                 k_min = j;
  129.         aux = a[k_min];
  130.         a[k_min] = a[i];
  131.         a[i] = aux;
  132.         printf("\nEtapa %d: ", i + 1);
  133.         afisare(a, n);
  134.     }
  135. }
  136.  
  137. void bubbleSort(int a[], int n)
  138. {
  139.     int i, j, aux;
  140.     for (i = 1; i < n; i++)
  141.     {
  142.         for (j = n - 1; j >= i; j--)
  143.             if (a[j - 1] > a[j])
  144.             {
  145.                 aux = a[j - 1];
  146.                 a[j - 1] = a[j];
  147.                 a[j] = aux;
  148.             }
  149.         printf("\nEtapa %d: ", i);
  150.         afisare(a, n);
  151.     }
  152.  
  153. }
  154.  
  155. void shakeSort(int a[], int n)
  156. {
  157.     int  j, k, s, d, aux, count = 1;
  158.     s = 1;
  159.     d = n - 1;
  160.     k = n - 1;
  161.     do
  162.     {
  163.         for (j = d; j >= s; j--)
  164.             if (a[j - 1] > a[j])
  165.             {
  166.                 aux = a[j - 1];
  167.                 a[j - 1] = a[j];
  168.                 a[j] = aux;
  169.                 k = j;
  170.             }
  171.         s = k + 1;
  172.         for (j = s; j <= d; j++)
  173.             if (a[j - 1] > a[j])
  174.             {
  175.                 aux = a[j - 1];
  176.                 a[j - 1] = a[j];
  177.                 a[j] = aux;
  178.                 k = j;
  179.             }
  180.         d = k - 1;
  181.         printf("\nEtapa %d: ", count);
  182.         afisare(a, n);
  183.         count++;
  184.  
  185.     } while (s <= d&&count<=pasi);
  186. }
  187. void binsort(int a[], int n)
  188. {
  189.     int i, aux;
  190.     for (i = 0; i < n; i++)
  191.     {
  192.         while (a[i] != i)
  193.         {
  194.             aux = a[a[i]];
  195.             a[a[i]] = a[i];
  196.             a[i] = aux;
  197.         }
  198.         printf("Etapa %d: ", i + 1);
  199.         afisare(a, n);
  200.     }
  201. }
  202.  
  203. void shellsort(int a[], int n)
  204. {
  205.     int i, j, aux, l, k;
  206.     int h[3] = { 5,3,1 };
  207.     for (l = 0; l < 3; l++)
  208.     {
  209.         k = h[l];
  210.         for (i = k; i < n; i++)
  211.         {
  212.             aux = a[i];
  213.             j = i - k;
  214.             while (j >= 0 && aux < a[j])
  215.             {
  216.                 a[j + k] = a[j];
  217.                 j = j - k;
  218.             }
  219.             a[j + k] = aux;
  220.         }
  221.         printf("Trecerea %d: ", l + 1);
  222.         afisare(a, n);
  223.     }
  224. }
  225.  
  226. void heapify(int arr[], int n, int i)
  227. {
  228.     int aux;
  229.     int largest = i; // Initialize largest as root
  230.     int l = 2 * i + 1; // left = 2*i + 1
  231.     int r = 2 * i + 2; // right = 2*i + 2
  232.  
  233.     // If left child is larger than root
  234.     if (l < n && arr[l] > arr[largest])
  235.         largest = l;
  236.  
  237.     // If right child is larger than largest so far
  238.     if (r < n && arr[r] > arr[largest])
  239.         largest = r;
  240.     // If largest is not root
  241.     if (largest != i)
  242.     {
  243.         aux = arr[i];
  244.         arr[i] = arr[largest];
  245.         arr[largest] = aux;
  246.  
  247.         // Recursively heapify the affected sub-tree
  248.         heapify(arr, n, largest);
  249.     }
  250. }
  251.  
  252. // main function to do heap sort
  253. void heapSort(int arr[], int n)
  254. {
  255.     int aux;
  256.     // Build heap (rearrange array)
  257.     for (int i = n / 2 - 1; i >= 0; i--)
  258.     {
  259.         heapify(arr, n, i);
  260.         printf("Etapa %da: ", n / 2 - i);
  261.         afisare(arr, n);
  262.     }
  263.  
  264.     // One by one extract an element from heap
  265.     for (int i = n - 1; i > 0; i--)
  266.     {
  267.         // Move current root to end
  268.         aux = arr[0];
  269.         arr[0] = arr[i];
  270.         arr[i] = aux;
  271.         printf("Etapa %db: ", n - i);
  272.         afisare(arr, n);
  273.         // call max heapify on the reduced heap
  274.         heapify(arr, i, 0);
  275.     }
  276. }
  277. int partition(int arr[], int low, int high)
  278. {
  279.     int pivot = arr[high];    // pivot
  280.     int i = (low - 1);  // Index of smaller element
  281.  
  282.     for (int j = low; j <= high - 1; j++)
  283.     {
  284.         // If current element is smaller than the pivot
  285.         if (arr[j] < pivot)
  286.         {
  287.             i++;    // increment index of smaller element
  288.             swap(&arr[i], &arr[j]);
  289.         }
  290.     }
  291.     swap(&arr[i + 1], &arr[high]);
  292.     return (i + 1);
  293. }
  294.  
  295. void quickSort(int a[], int s, int d)
  296. {
  297.     if (s < d)
  298.     {
  299.         int pi = partition(a, s, d);
  300.         printf("Etapa %d: ", count);
  301.         count++;
  302.         afisare(a, N);
  303.         quickSort(a, s, pi - 1);
  304.         quickSort(a, pi, d);
  305.     }
  306. }
  307. int biti(int x, int k, int j)
  308. {
  309.     return (x >> k) & ~(~0 << j);
  310. }
  311. void radix_interschimbare(int a[], int s, int d, int b)
  312. {
  313.     int i, j, aux;
  314.     if (d > s && b >= 0)
  315.     {
  316.         i = s;
  317.         j = d;
  318.         do
  319.         {
  320.             while (i < j && biti(a[i], b, 1) == 0)
  321.                 i++;
  322.             while (i < j && biti(a[j], b, 1) == 1)
  323.                 j--;
  324.             aux = a[i];
  325.             a[i] = a[j];
  326.             a[j] = aux;
  327.  
  328.         } while (i != j);
  329.         printf("Etapa %d: ", count);
  330.         count++;
  331.         afisare(a, N);
  332.         if (biti(a[d], b, 1) == 0)
  333.             j++;
  334.         radix_interschimbare(a, s, j - 1, b - 1);
  335.         radix_interschimbare(a, j, d, b - 1);
  336.     }
  337. }
  338. void radix_direct(int a[], int n)
  339. {
  340.     int b, T[100], Numar[100], m, k, i, t;
  341.     b = sizeof(int) * 8;
  342.     m = 4;
  343.     for (t = 0; t < b / m; t++)
  344.     {
  345.         for (i = 0; i < pow(2, m); i++)
  346.             Numar[i] = 0;
  347.         for (i = 0; i < n; i++)
  348.         {
  349.             k = biti(a[i], t * m, m);
  350.             Numar[k]++;
  351.         }
  352.         for (i = 1; i < pow(2, m); i++)
  353.             Numar[i] = Numar[i] + Numar[i - 1];
  354.         for (i = n - 1; i >= 0; i--)
  355.         {
  356.             k = biti(a[i], t * m, m);
  357.             T[Numar[k] - 1] = a[i];
  358.             Numar[k]--;
  359.  
  360.         }
  361.         printf("Etapa %d: ", t + 1);
  362.         afisare(T, n);
  363.         for (i = 0; i < n; i++)
  364.             a[i] = T[i];
  365.     }
  366. }
  367.  
  368. int cautare_liniara(int* a, int N)
  369. {
  370.     int x;
  371.     printf("El: ");
  372.     scanf("%d", &x);
  373.     int i;
  374.     for (i = 0; i < N; i++)
  375.     {
  376.         if (a[i] == x)
  377.             return i;
  378.     }
  379.     return -1;
  380. }
  381.  
  382. int cautare_fanion(int* a, int N)
  383. {
  384.     int x;
  385.     printf("El: ");
  386.     scanf("%d", &x);
  387.     int i = 0;
  388.     a[N] = x;
  389.     while (a[i] != x)
  390.     {
  391.         i++;
  392.     }
  393.     return i;
  394. }
  395.  
  396. int cautare_binara(int s, int d, int* a)
  397. {
  398.     int x;
  399.     printf("El: ");
  400.     scanf("%d", &x);
  401.     int m;
  402.     if (s > d)
  403.         return -1;
  404.     else
  405.     {
  406.         m = (s + d) / 2;
  407.         if (x == a[m])
  408.             return m;
  409.         if (x < a[m])
  410.             return cautare_binara(s, m - 1, x, a);
  411.         else
  412.             return cautare_binara(m + 1, d, x, a);
  413.     }
  414. }
  415.  
  416. int cautare_interpolare(int* a, int ic, int sf)
  417. {
  418.     int x;
  419.     printf("El: ");
  420.     scanf("%d", &x);
  421.     if (ic <= sf)
  422.     {
  423.         int m;
  424.         m = ic + (x - a[ic]) * (sf - ic) / (a[sf] - a[ic]);
  425.         if (x == a[m])
  426.             return m + 1;
  427.         else
  428.             if (x < a[m])
  429.                 return cautare_interpolare(a, x, ic, m - 1);
  430.             else
  431.                 return cautare_interpolare(a, x, m + 1, sf);
  432.     }
  433.     else return 0;
  434. }
  435.  
  436.  
  437. int main()
  438. {
  439.     int a[20], n, opt, b,x;
  440.     do
  441.     {
  442.         printf("1.Sortare prin insertie\n");
  443.         printf("2.Sortare prin selectie\n");
  444.         printf("3.Sortare Bubblesort\n");
  445.         printf("4.Shakesort\n");
  446.         printf("5.Binsort\n");
  447.         printf("6.Shellsort\n");
  448.         printf("7.Heap sort(ansamblu invers)\n");
  449.         printf("8.Quicksort\n");
  450.         printf("9.Radix interschimbare\n");
  451.         printf("10.Radix direct\n");
  452.         printf("11.Interschimbare\n");
  453.         printf("12.Cautare liniara\n");
  454.         printf("13.Cautare fanion\n");
  455.         printf("14.Cautare binara\n");
  456.         printf("15.Cautare interpolare\n");
  457.         printf("0.Iesire\n");
  458.         printf("Dati optiunea: ");
  459.         scanf("%d", &opt);
  460.         switch (opt)
  461.         {
  462.         case 1:
  463.             printf("SORTAREA PRIN INSERTIE\n");
  464.             printf("n=");
  465.             scanf("%d", &n);
  466.             citire(a, n);
  467.             insertie(a, n);
  468.             printf("\nTabloul dupa sortare:\n");
  469.             afisare(a, n);
  470.             break;
  471.         case 2:
  472.             printf("\nSORTAREA PRIN SELECTIE\n");
  473.             printf("n=");
  474.             scanf("%d", &n);
  475.             citire(a, n);
  476.             selectie(a, n);
  477.             printf("\nTabloul dupa sortare:\n");
  478.             afisare(a, n);
  479.             break;
  480.         case 3:
  481.             printf("\nBUBLE SORT\n");
  482.             printf("n=");
  483.             scanf("%d", &n);
  484.             citire(a, n);
  485.             bubbleSort(a, n);
  486.             printf("\nTabloul dupa sortare:\n");
  487.             afisare(a, n);
  488.             break;
  489.         case 4:
  490.             printf("\nSHAKE SORT\n");
  491.             printf("n=");
  492.             scanf("%d", &n);
  493.             citire(a, n);
  494.             shakeSort(a, n);
  495.             printf("\nTabloul dupa sortare:\n");
  496.             afisare(a, n);
  497.             break;
  498.         case 5:
  499.             printf("\nBinsort\n");
  500.             printf("n=");
  501.             scanf("%d", &n);
  502.             citire(a, n);
  503.             binsort(a, n);
  504.             printf("\nTabloul dupa sortare:\n");
  505.             afisare(a, n);
  506.             break;
  507.         case 6:
  508.             printf("Shellsort");
  509.             printf("n=");
  510.             scanf("%d", &n);
  511.             citire(a, n);
  512.             shellsort(a, n);
  513.             printf("\nTabloul dupa sortare:\n");
  514.             afisare(a, n);
  515.             break;
  516.         case 7:
  517.             printf("\nHEAPSORT\n");
  518.             printf("n=");
  519.             scanf("%d", &n);
  520.             citire(a, n);
  521.             heapSort(a, n);
  522.             printf("\nTabloul dupa sortare:\n");
  523.             afisare(a, n);
  524.             break;
  525.         case 8:
  526.             printf("\nQUICKSORT\n");
  527.             printf("n=");
  528.             scanf("%d", &n);
  529.             N = n;
  530.             count = 1;
  531.             citire(a, n);
  532.             quickSort(a, 0, n - 1);
  533.             printf("\nTabloul dupa sortare:\n");
  534.             afisare(a, n);
  535.             break;
  536.         case 9:
  537.             printf("\nRADIX INTERSCHIMBARE\n");
  538.             printf("n=");
  539.             scanf("%d", &n);
  540.             citire(a, n);
  541.             b = sizeof(int) * 8;
  542.             N = n;
  543.             count = 1;
  544.             radix_interschimbare(a, 0, n - 1, b - 1);
  545.             printf("\nTabloul dupa sortare:\n");
  546.             afisare(a, n);
  547.             break;
  548.         case 10:
  549.             printf("\nRADIX DIRECT\n");
  550.             printf("n=");
  551.             scanf("%d", &n);
  552.             citire(a, n);
  553.             radix_direct(a, n);
  554.             printf("\nTabloul dupa sortare:\n");
  555.             afisare(a, n);
  556.             break;
  557.         case 11:
  558.             printf("\nInterschimbare\n");
  559.             printf("n=");
  560.             scanf("%d", &n);
  561.             citire(a, n);
  562.             interschimbare(a, n);
  563.             printf("\nTabloul dupa sortare:\n");
  564.             afisare(a, n);
  565.             break;
  566.         case 12:
  567.             printf("El: ");
  568.             scanf("%d", &x);
  569.             printf("%d", cautare_liniara(a,n));
  570.             break;
  571.         case 13:
  572.             printf("El: ");
  573.             scanf("%d", &x);
  574.             printf("%d", cautare_fanion(a, n));
  575.             break;
  576.         case 14:
  577.             printf("El: ");
  578.             scanf("%d", &x);
  579.             printf("%d", cautare_binara(0, n - 1, a));
  580.             break;
  581.         case 15:
  582.             printf("El: ");
  583.             scanf("%d", &x);
  584.             printf("%d", cautare_interpolare(a, 0, n - 1));
  585.             break;
  586.         case 0:
  587.             printf("\nAti oprit consola interactiva\n");
  588.             break;
  589.         default:
  590.             printf("\nOPTIUNE INVALIDA\n");
  591.             break;
  592.         }
  593.     } while (opt != 0);
  594.     getch();
  595.     return 0;
  596. }
Advertisement
Add Comment
Please, Sign In to add comment