Patey

Untitled

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