Advertisement
ATSTNG

Bubble Sort Explanation

Dec 5th, 2016
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 6.07 KB | None | 0 0
  1. // Это исходный код файла "Sort_T.pas",
  2. // отрефакторенный и подробно закомментированный
  3.  
  4. // Тут реализован (через одно место) алгоритм сортировки пузырьком
  5.  
  6. // Идея в том, что мы попарно сравниваем ближайшие элементы в массиве
  7. // и, если они стоят "неправильно" (больший элемент стоит перед меньшим),
  8. // то мы меняем их местами, тем самым приводя массив в более сортированный вид.
  9. // Так мы будем проходиться по всему массиву и постепенно двигать элементы
  10. // к тем позициям, в которых они должны стоять в сортированном массиве.
  11. // И когда не будет "неправильных позиций" в массиве, то он будет полностью
  12. // сортирован и мы завершаем работу алгоритма.
  13.  
  14. // Подробнее https://ru.wikipedia.org/wiki/Сортировка_пузырьком
  15.  
  16. // Программа srt - sort - сортировка
  17. program srt;
  18. var
  19.   // n - длинна сортируемого массива
  20.   // i, j - переменные циклов и индексы элементов массива
  21.   // p - показатель того, что мы еще не меняли массив в текущем проходе по массиву
  22.   // fin - finished - показатель того, что алгоритм завершен и массив отсортирован
  23.   // sit - situation - номер ситуации, в которой мы оказались
  24.   //                         (подробнее про сами ситуации описано ниже)
  25.   // x - вспомогательная переменная для того, чтоб обменивать элементы массива
  26.   i, j, n: integer;
  27.   p, fin: boolean;
  28.   sit: byte;
  29.   {A: array[1..100] of real;}
  30.   x: real;
  31.  
  32. type
  33.   Arr = array [1..100] of real;  
  34.  
  35. var
  36.   A: arr;
  37.  
  38. // Эта процедура заполняет первые n1 элементов массива Ar
  39. // случайными целыми числами от 0 до 999
  40. procedure vvod(n1: integer; var Ar: Arr);
  41. var
  42.   j: byte;
  43. begin
  44.   randomize;
  45.   for j := 1 to n1 do Ar[j] := random(1000);
  46. end;
  47.  
  48. begin
  49.   // Что-то вроде "введите длину массива", но кодировка улетела
  50.   writeln('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® н«Ґ¬Ґ­в®ў');
  51.   readln(n);
  52.   vvod(n, A);
  53.  
  54.   // Изначальные значения переменных
  55.   fin := false;
  56.   p := true;
  57.   i := 1;
  58.  
  59.   // Сама сортировка
  60.   // Будем проходиться по парам массива и обрабатывать ситуации
  61.   repeat
  62.     // Определим какая у нас ситуация
  63.  
  64.     // === Ситуация 1 ===
  65.     // мы еще не дошли до конца массива (i <= n-1)
  66.     // и текущий элемент больше следующего (a[i] > a[i+1])
  67.     if (i <= n-1) and (a[i] > a[i+1]) then sit := 1;
  68.    
  69.     // === Ситуация 2 ===
  70.     // мы еще не дошли до конца массива (i <= n-1)
  71.     // и текущий элемент меньше или равен следующему (a[i] <= a[i+1])
  72.     if (i <= n-1) and (a[i] <= a[i+1]) then sit := 2;
  73.    
  74.     // === Ситуация 3 ===
  75.     // мы дошли до конца массива (i > n-1)
  76.     // и мы меняли массив на этом проходе (p = false)
  77.     if (i > n-1) and (p = false) then sit := 3;
  78.    
  79.     // === Ситуация 4 ===
  80.     // мы дошли до конца массива (i > n-1)
  81.     // и мы не меняли массив на этом проходе (p = true)
  82.     if (i > n-1) and (p = true) then sit := 4;
  83.    
  84.     // В данном случае конец массива - это когда a[i] - последний элемент
  85.     // и элемента a[i+1] уже не существует
  86.    
  87.     // Тут мы обрабатываем ситуации
  88.     case sit of
  89.       // В ситуации 1 мы должны поменять местами a[i] и a[i+1],
  90.       // пометить, что мы сделали изменение в массиве на этом проходе
  91.       // и перейти к следующей паре
  92.       1: begin
  93.            x := A[i]; A[i] := A[i+1]; a[i+1] := x;
  94.            p := false;
  95.            i := i+1
  96.          end;
  97.          
  98.       // В ситуации 2 мы должны просто перейти к следущюей паре
  99.       2: begin i := i+1 end;
  100.       // Изначально тут опечатка и выполняется просто "i := 2;",
  101.       // что очевидно неверно. Исходная версия:
  102.       {2: begin i := 1+1 end;}
  103.      
  104.       // В ситуации 3 проход по массиву закончился, но он не последний
  105.       // (т. к. мы меняли элементы в массиве), поэтому начнем новый проход:
  106.       // отметим, что мы пока не меняли массив
  107.       // и поставим индекс на начало массива
  108.       3: begin p := true; i := 1; end;
  109.      
  110.       // В ситуации 4 закончился последний проход по массиву, поэтому просто
  111.       // отмечаем, что алгоритм завершен.
  112.       4: begin fin := true end;
  113.     end;
  114.   until fin; // выходим из цикла, когда отмечено, что алгоритм завершен
  115.  
  116.   // выводим на экран сортированный массив
  117.   for i := 1 to n do writeln(A[i]:2:2);
  118.  
  119.   readln;
  120. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement