Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.24 KB | None | 0 0
  1. //leftb - левый край( до куда надо идти в обртануб сторону)
  2. //rightb - правй край ( до куда надо идти по ходу сортировки )
  3. // запускается цикл девому краю даем индекс 0, а правому индекс i(в дальнейшем будет испльзоваться для проходки не с самого начала)
  4. //второй цикл идет до конца идет сравнение и если вдруг второе меньш первого то меняем местами, дойдя до конца массива, длине массива передается индекс который у нас записался в случае смены чисел (строка *), и правому краю тоже записывается индекс если была смена, если смены не было то записываются нули
  5. //дальше идет пробег справа налево (до этого шли слева направо) пробег идет до i и также идет сравнение, если вдруг происходит замена то мы дойдя до i снова пойдем слева направа, по факту это сортировка как качели, в конечном итоге она пройдет справа налево и закончится
  6.  
  7. void bubblesort(unsigned long nel,
  8.                 int (*compare)(unsigned long i, unsigned long j),
  9.                 void (*swap)(unsigned long i, unsigned long j)) {
  10.     unsigned long leftb, rightb, i = 0;
  11.     nel = nel-1;
  12.     while (i < nel) {
  13.         leftb = 0;
  14.         rightb = i;
  15.         while(rightb < nel) {
  16.             if (compare(rightb, rightb + 1) == 1) {
  17.                 swap(rightb, rightb + 1);
  18.                 leftb = rightb; //*
  19.             }
  20.             rightb = rightb + 1;
  21.         }
  22.         nel = leftb;
  23.         rightb = leftb;
  24.         while (rightb > i) {
  25.             if (compare(rightb - 1, rightb) == 1) {
  26.                 swap(rightb - 1, rightb);
  27.                 leftb = rightb;
  28.             }
  29.             rightb = rightb - 1;
  30.         }
  31.         i = leftb;
  32.     }
  33. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement