Advertisement
Ladies_Man

#SORT__ Double - Bubble (Двунаправленный пузырек)

Jan 20th, 2014
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.37 KB | None | 0 0
  1. void bubblesort(unsigned long nel, int (*compare)(unsigned long i, unsigned long j), void (*swap)(unsigned long i, unsigned long j))
  2. {
  3.     int i = 0, ready = 0, lastswapright, lastswapleft, lborder, rborder;
  4.     unsigned long left = 0, right = nel;
  5.     right--;
  6.     lborder = 0;
  7.     rborder = nel - 1;
  8.     do {
  9.         ready = 0;
  10.        
  11.         /* --> */
  12.         for (i = left; i < right; i++) {
  13.             if (compare(i + 1, i) < 0) {
  14.                 swap(i + 1, i);
  15.                 ready = 1;          
  16.                 lastswapright = i;    
  17.             }
  18.         }
  19.  
  20.  
  21.         int lsr = lastswapright;
  22.         int lsl = lastswapleft;
  23.         if ((ready == 0) && ((i == right) ||
  24.             (lsl == left) || (rborder == 0) || (lborder == nel)))
  25.             goto exit;
  26.  
  27.         right = lastswapright;
  28.         ready = 0;
  29.         lborder++;
  30.  
  31.  /* <-- */
  32.         for (i = right; i > left; i--) { // <--
  33.             if (compare(i - 1, i) > 0) {
  34.                 swap(i - 1, i);
  35.                 ready = 1;  
  36.                 lastswapleft = i;
  37.             }
  38.         }
  39.  
  40.  
  41.         lsr = lastswapright;
  42.         lsl = lastswapleft;
  43.         if ((ready == 0) && ((lsr == right) ||
  44.             (i == left) || (rborder == 0) || (lborder == nel)))
  45.             goto exit;
  46.  
  47.         left = lastswapleft;
  48.         rborder--;
  49.     } while (ready);
  50.     exit: ready = 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement