Постановка задачи: выполнить сортировку целых чисел по возрастанию методом пузырька
Сначала приведем листинг программы. Попробуйте самостоятельно понять суть сортировки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void bubble_sort(int* a,int n) { int tmp,j; bool flag; //www.itmathrepetitor.ru for (int i=0; i<n; i++) { flag=true; j=0; while (j<n-i-1) { if (a[j]>a[j+1]) { tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; flag=false; } j++; } if (flag) break; } } |
Последовательно сравниваем a[0] с a[1], затем a[1] с a[2] и так далее, меняя местами a[i] c a[i+1], если a[i]>a[i+1]. Таким образом, на последнем месте (номер n-1) в массиве окажется наибольшее значение. Например, цепочка преобразований для массива 8 10 2 4 \(\Rightarrow\) 8 10 2 4 \(\Rightarrow\) 8 2 10 4 \(\Rightarrow\) 8 2 4 10. Далее опять просматриваем все пары элементов с самого начала, но до элемента с номером n-2. Тогда на предпоследнем месте окажется второе по величине значение. Аналогично продолжаем процесс. Если при очередном просмотре не было произведено ни одного обмена, значит, сортировку можно завершать досрочно (команда break).
Если значения элементов уподобить размерам пузырьков, то процесс сортировки похож на то, как самые большие пузырьки по очереди всплывают, оттесняя остальных.
Сложность сортировки: \(\Theta (n^2)\)
Код написан на С++. Индексы массива от 0 до n-1, если размер массива равен n.