huutho_96

Sort.h

Jun 18th, 2016
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.06 KB | None | 0 0
  1. //hàm Swap hoán đổi giá trị của 2 số truyền vào
  2. void Swap(int &a, int &b)
  3. {
  4.     int t;
  5.     t = a;
  6.     a = b;
  7.     b = t;
  8. }
  9. //Interchange sort
  10. void InterchangeSort(int a[], int N)
  11. {
  12.     int i, j;
  13.     for (i = 0; i < N - 1; i++)
  14.         for (j = i + 1; j < N; j++)
  15.             if (a[j] < a[i])
  16.                 Swap(a[i], a[j]);
  17. }
  18. //Selection Sort
  19. void SelectionSort(int a[], int n)
  20. {
  21.     int min, i, j, t;
  22.     for (i = 0; i < n - 1; i++)
  23.     {
  24.         min = i;
  25.         for (j = i + 1; j < n; j++)
  26.             if (a[j] < a[min])
  27.                 min = j;
  28.         Swap(a[i], a[min]);
  29.     }
  30. }
  31. //Bubble Sort
  32. void BubbleSort(int a[], int n)
  33. {
  34.     int i, j;
  35.     for (i = 0; i<n - 1; i++)
  36.         for (j = n - 1; j >i; j--)
  37.             if (a[j]< a[j - 1])
  38.                 Swap(a[j], a[j - 1]);
  39. }
  40. //Shake Sort
  41. void ShakeSort(int a[], int n)
  42. {
  43.     int i, j;
  44.     int left, right, k;
  45.     left = 0; right = n - 1; k = n - 1;
  46.     while (left < right)
  47.     {
  48.         for (j = right; j > left; j--)
  49.             if (a[j] < a[j - 1])
  50.             {
  51.                 Swap(a[j], a[j - 1]);
  52.                 k = j;
  53.             }
  54.         left = k;
  55.  
  56.         for (i = left; i < right; i++)
  57.             if (a[i] > a[i + 1])
  58.             {
  59.                 Swap(a[i], a[i + 1]);
  60.                 k = i;
  61.             }
  62.         right = k;
  63.     }
  64. }
  65. //Insertion Sort
  66. void InsertionSort(int a[], int n)
  67. {
  68.     int pos, i;
  69.     int x;
  70.     for (i = 1; i<n; i++)
  71.     {
  72.         x = a[i];
  73.         pos = i - 1;
  74.         while ((pos >= 0) && (a[pos] > x))
  75.         {
  76.             a[pos + 1] = a[pos];
  77.             pos--;
  78.         }
  79.         a[pos + 1] = x;
  80.     }
  81. }
  82. //BInsertion Sort
  83. void BInsertionSort(int a[], int n)
  84. {
  85.     int l, r, m, i;
  86.     int x;
  87.     for (int i = 1; i<n; i++)
  88.     {
  89.         x = a[i]; l = 0; r = i - 1;
  90.         while (l <= r)
  91.         {
  92.             m = (l + r) / 2;
  93.             if (x < a[m]) r = m - 1;
  94.             else l = m + 1;
  95.         }
  96.         for (int j = i - 1; j >= l; j--)
  97.             a[j + 1] = a[j];
  98.         a[l] = x;
  99.     }
  100. }
  101. //Shell Sort
  102. void ShellSort(int a[], int n, int h[], int k)
  103. {
  104.     int step, i, j, x, len;
  105.     for (step = 0; step <k; step++)
  106.     {
  107.         len = h[step];
  108.         for (i = len; i < n; i++)
  109.         {
  110.             x = a[i];
  111.             j = i - len;
  112.             while ((x < a[j]) && (j >= 0))
  113.             {
  114.                 a[j + len] = a[j];
  115.                 j = j - len;
  116.             }
  117.             a[j + len] = x;
  118.         }
  119.     }
  120. }
  121. //Heap Sort
  122. void shift(int a[], int l, int r)
  123. {
  124.     int x, i, j;
  125.     i = l;
  126.     j = 2 * i + 1;
  127.     x = a[i];
  128.     while (j <= r)
  129.     {
  130.         if (j < r)
  131.             if (a[j] < a[j + 1])
  132.                 j++;
  133.         if (a[j] <= x) return;
  134.         else
  135.         {
  136.             a[i] = a[j];
  137.             a[j] = x;
  138.             i = j;
  139.             j = 2 * i + 1;
  140.             x = a[i];
  141.         }
  142.     }
  143. }
  144. void CreateHeap(int a[], int n) {
  145.     int l;
  146.     l = n / 2 - 1;
  147.     while (l >= 0) {
  148.         shift(a, l, n - 1);
  149.         l = l - 1;
  150.     }
  151. }
  152. void HeapSort(int a[], int n)
  153. {
  154.     int r;
  155.     CreateHeap(a, n);
  156.     r = n - 1;
  157.     while (r > 0)
  158.     {
  159.         Swap(a[0], a[r]);
  160.         r--;
  161.         if (r > 0)
  162.             shift(a, 0, r);
  163.     }
  164. }
  165. //Quick Sort
  166. void QuickSort(int a[], int left, int right) {
  167.     int i, j, x;
  168.     x = a[(left + right) / 2];
  169.     i = left; j = right;
  170.     do{
  171.         while (a[i] < x) i++;
  172.         while (a[j] > x) j--;
  173.         if (i <= j)
  174.         {
  175.             Swap(a[i], a[j]);
  176.             i++;
  177.             j--;
  178.         }
  179.     } while (i <= j);
  180.     if (left<j)
  181.         QuickSort(a, left, j);
  182.     if (i<right)
  183.         QuickSort(a, i, right);
  184. }
  185. //Merge Sort
  186. #define MAX 1024
  187. int b[MAX], c[MAX], nb, nc;
  188. void Distribute(int a[], int N, int &nb, int &nc, int k)
  189. {
  190.     int i, pa, pb, pc;
  191.     pa = pb = pc = 0;
  192.     while (pa < N)
  193.     {
  194.         for (i = 0; (pa < N) && (i < k); i++, pa++, pb++)
  195.             b[pb] = a[pa];
  196.         for (i = 0; (pa < N) && (i < k); i++, pa++, pc++)
  197.             c[pc] = a[pa];
  198.     }
  199.     nb = pb;
  200.     nc = pc;
  201. }
  202. int timmin(int a, int b)
  203. {
  204.     if (a > b) return b;
  205.     else a;
  206. }
  207. void Merge(int a[], int nb, int nc, int k)
  208. {
  209.     int p, pb, pc, ib, ic, kb, kc;
  210.     p = pb = pc = 0;
  211.     ib = ic = 0;
  212.     while ((nb > 0) && (nc > 0))
  213.     {
  214.         kb = timmin(k, nb);
  215.         kc = timmin(k, nc);
  216.         if (b[pb + ib] <= c[pc + ic])
  217.         {
  218.             a[p++] = b[pb + ib]; ib++;
  219.             if (ib == kb)
  220.             {
  221.                 for (; ic < kc; ic++)
  222.                     a[p++] = c[pc + ic];
  223.                 pb += kb;
  224.                 pc += kc;
  225.                 ib = ic = 0;
  226.                 nb -= kb;
  227.                 nc -= kc;
  228.             }
  229.         }
  230.         else
  231.         {
  232.             a[p++] = c[pc + ic]; ic++;
  233.             if (ic == kc)
  234.             {
  235.                 for (; ib<kb; ib++) a[p++] = b[pb + ib];
  236.                 pb += kb; pc += kc; ib = ic = 0;
  237.                 nb -= kb; nc -= kc;
  238.             }
  239.         }
  240.     }
  241. }
  242.  
  243. void MergeSort(int a[], int n)
  244. {
  245.     int k;
  246.     for (k = 1; k < n; k *= 2) {
  247.         Distribute(a, n, nb, nc, k);
  248.         Merge(a, nb, nc, k);
  249.     }
  250. }
Add Comment
Please, Sign In to add comment