Advertisement
Alx09

Untitled

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