Сортировка пузырьком
Содержание:
- Реализация
- Как создать пузырьковую сортировку
- Как улучшить пузырьковую сортировку
- Реализация пузырьковой сортировки в python:
- Как работает Быстрая сортировка
- Сортировка данных вставками
- How Bubble Sort Works?
- Implementing Bubble Sort Algorithm
- Алгоритм
- Пример работы алгоритма
- Implementing the Bubble Sort Algorithm
- Complexity Analysis of Bubble Sort
- Программа
- Пример работы алгоритма
- What is Bubble Sort
Реализация
Сортировка массивов
Быстрая сортировка является естественным рекурсивным алгоритмом — разделите входной массив на меньшие массивы, переместите элементы в нужную сторону оси и повторите.
При этом мы будем использовать две функции — partition() и quick_sort().
Давайте начнем с функции partition():
def partition(array, begin, end): pivot = begin for i in xrange(begin+1, end+1): if array <= array: pivot += 1 array, array = array, array array, array = array, array return pivot
И, наконец, давайте реализуем функцию quick_sort():
def quick_sort(array, begin=0, end=None): if end is None: end = len(array) - 1 def _quicksort(array, begin, end): if begin >= end: return pivot = partition(array, begin, end) _quicksort(array, begin, pivot-1) _quicksort(array, pivot+1, end) return _quicksort(array, begin, end)
После того, как обе функции реализованы, мы можем запустить quick_sort():
array = quick_sort(array) print(array)
Результат:
Поскольку алгоритм unstable (нестабилен), нет никакой гарантии, что два 19 будут всегда в этом порядке друг за другом. Хотя это ничего не значит для массива целых чисел.
Оптимизация быстрой сортировки
Учитывая, что быстрая сортировка сортирует «половинки» заданного массива независимо друг от друга, это оказывается очень удобным для распараллеливания. У нас может быть отдельный поток, который сортирует каждую «половину» массива, и в идеале мы могли бы вдвое сократить время, необходимое для его сортировки.
Однако быстрая сортировка может иметь очень глубокий рекурсивный стек вызовов, если нам особенно не повезло в выборе опорного элемента, а распараллеливание будет не так эффективно, как в случае сортировки слиянием.
Для сортировки небольших массивов рекомендуется использовать простой нерекурсивный алгоритм. Даже что-то простое, например сортировка вставкой, будет более эффективным для небольших массивов, чем быстрая сортировка. Поэтому в идеале мы могли бы проверить, имеет ли наш подмассив лишь небольшое количество элементов (большинство рекомендаций говорят о 10 или менее значений), и если да, то мы бы отсортировали его с помощью Insertion Sort (сортировка вставкой).
Как создать пузырьковую сортировку
Вот что нам придется делать для создания пузырьковой сортировки:
- Создать два цикла , чтобы проходить по всем элементам массива раз ( это размер массива).
- Сравнивать ячейки массива, с помощью оператора ветвления .
- Менять местами значения ячеек.
В примере ниже мы предложили пользователю заполнить массив, который мы дальше отсортируем используя пузырьковую сортировку.
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, «rus»);
int digitals; // объявили массив на 10 ячеек
cout << «Введите 10 чисел для заполнения массива: » << endl;
for (int i = 0; i < 10; i++) {
cin >> digitals; // «читаем» элементы в массив
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 9; j++) {
if (digitals > digitals) {
int b = digitals; // создали дополнительную переменную
digitals = digitals; // меняем местами
digitals = b; // значения элементов
}
}
}
cout << «Массив в отсортированном виде: «;
for (int i = 0; i < 10; i++) {
cout << digitals << » «; // выводим элементы массива
}
system(«pause»);
return 0;
}
1 |
#include <iostream> usingnamespacestd; intmain(){ setlocale(LC_ALL,»rus»); intdigitals10;// объявили массив на 10 ячеек cout<<«Введите 10 чисел для заполнения массива: «<<endl; for(inti=;i<10;i++){ cin>>digitalsi;// «читаем» элементы в массив } for(inti=;i<10;i++){ for(intj=;j<9;j++){ if(digitalsj>digitalsj+1){ intb=digitalsj;// создали дополнительную переменную digitalsj=digitalsj+1;// меняем местами digitalsj+1=b;// значения элементов } } } cout<<«Массив в отсортированном виде: «; for(inti=;i<10;i++){ cout<<digitalsi<<» «;// выводим элементы массива } system(«pause»); return; } |
Давайте поподробнее разберем строки 16 — 24 (здесь находится пузырьковая сортировка)
- В строке 16: мы создали первый цикл .
- В строке 17: аналогично был создан второй, но уже вложенный цикл.
-
В строке 18: происходит сравнивание двух элементов.
- Если результат этого условия положительный, то мы меняем значение элементов.
- Если же результат отрицателен, то мы пропускаем этап смены значений.
- В строке 19: создали переменную , чтобы менять значения ячеек и местами.
Давайте посмотрим, что выведет программа выше при запуске:
sort_puzerek.cpp
Введите 10 чисел для заполнения массива:
5 3 6 2 7 0 2 8 9 10
Массив в отсортированном виде: 0 2 2 3 5 6 7 8 9 10
Process returned 0 (0x0) execution time : 0.005 s
Press any key to continue.
Как улучшить пузырьковую сортировку
Ниже вы можете видеть оптимизированную версию пузырьковой сортировки.
for (int i = 0; i < 10; i++) {
bool flag = true;
for (int j = 0; j < 10 — (i + 1); j++) {
if (digitals > digitals) {
flag = false;
swap (digitals, digitals);
}
}
if (flag) {
break;
}
}
1 |
for(inti=;i<10;i++){ boolflag=true; for(intj=;j<10-(i+1);j++){ if(digitalsj>digitalsj+1){ flag=false; swap(digitalsj,digitalsj+1); } } if(flag){ break; } } |
Давайте посмотрим, что мы сделали для ее оптимизации:
- В строке 17: изменили условие внутреннего цикла на .Поэтому чтобы лишний раз не сравнивать элементы массива тратя на это время, мы решили уменьшать отрезок внутреннего цикла на 1, после каждого полного прохода внешнего цикла.
- Вы могли заметить, что если даже массив стал отсортирован (или сразу был отсортирован) алгоритм все равно продолжает сравнивать элементы.
Для этого в строке 5: чтобы пузырьковая сортировка останавливалась (когда массив уже стал отсортирован), мы объявили булеву переменную (ее обычно называют флаг или флажок). Еще при ее инициализации мы поместили значение , но она меняется на:
false, если результат условия в строке 4: положительный.
А в строке 9: чтобы мы могли выйти из алгоритма мы проверяем:
- Если булева переменная равна , значит массив уже полностью отсортирован и можно выйти. Для этого используем оператор .
- Если же значение равно , то продолжаем сортировать массив.
В строке 6: вы (возможно) увидели незнакомую функцию . Если коротко описать что она делает, то она принимает два аргумента (через запятую) и меняет их значения местами. В нашем случаи она принимает ячейки и . Мы использовали эту функцию чтобы не писать вот эти 3 строчки:
int b = digitals;
digitals = digitals;
digitals = b;
1 |
intb=digitalsj; digitalsj=digitalsj+1; digitalsj+1=b; |
Использовать ее необязательно, потому что она не сделает код быстрее. Но как мы сказали выше, кода станет меньше.
Реализация пузырьковой сортировки в python:
Для сортировки в порядке возрастания:
# Python Bubble Sort program def bubble_sort(list1): for i in range(0,len(list1)-1): # The total number of passes,bubbles: i for j in range(0,len(list1)-i-1): # The total number of iterations: j if list1 > list1: ,list1 # swap elements return list1 list1= print(bubble_sort(list1))
ВЫХОД-
Пузырчатая сортировка python также работает со списком строк таким же образом.
list1= print(bubble_sort(list1))
При приведении приведенного выше списка функция возвращает вывод следующим образом:
Для сортировки в порядке убывания-
def bubble_sort_descending(list1): for i in range(0,len(list1)-1): for j in range(0,len(list1)-i-1): if list1 < list1:# Observe '<' is used instead of '>' ,list1 return list1 list1= print(bubble_sort_descending (list1))
OUTPUT-
Pass- 1 Pass- 2 Pass- 3 Pass- 4
Мы можем наблюдать, что получили правильный вывод 2-й проход итерации-2, но все же наш алгоритм продолжает сортировать уже отсортированный список. Это один из недостатков пузырьковой сортировки. Эта проблема может быть решена с помощью вставки или любого другого алгоритма сортировки. Для лучшего понимания Inserting sort посетите сайт http://pythonpool.com/insertion-sort-python/
Как работает Быстрая сортировка
Быстрая сортировка чаще всего не сможет разделить массив на равные части. Это потому, что весь процесс зависит от того, как мы выбираем опорный элемент. Нам нужно выбрать опору так, чтобы она была примерно больше половины элементов и, следовательно, примерно меньше, чем другая половина элементов. Каким бы интуитивным ни казался этот процесс, это очень сложно сделать.
Подумайте об этом на мгновение — как бы вы выбрали адекватную опору для вашего массива? В истории быстрой сортировки было представлено много идей о том, как выбрать центральную точку — случайный выбор элемента, который не работает из-за того, что «дорогой» выбор случайного элемента не гарантирует хорошего выбора центральной точки; выбор элемента из середины; выбор медианы первого, среднего и последнего элемента; и еще более сложные рекурсивные формулы.
Самый простой подход — просто выбрать первый (или последний) элемент. По иронии судьбы, это приводит к быстрой сортировке на уже отсортированных (или почти отсортированных) массивах.
Именно так большинство людей выбирают реализацию быстрой сортировки, и, так как это просто и этот способ выбора опоры является очень эффективной операцией, и это именно то, что мы будем делать.
Теперь, когда мы выбрали опорный элемент — что нам с ним делать? Опять же, есть несколько способов сделать само разбиение. У нас будет «указатель» на нашу опору, указатель на «меньшие» элементы и указатель на «более крупные» элементы.
Цель состоит в том, чтобы переместить элементы так, чтобы все элементы, меньшие, чем опора, находились слева от него, а все более крупные элементы были справа от него. Меньшие и большие элементы не обязательно будут отсортированы, мы просто хотим, чтобы они находились на правильной стороне оси. Затем мы рекурсивно проходим левую и правую сторону оси.
Рассмотрим пошагово то, что мы планируем сделать, это поможет проиллюстрировать весь процесс. Пусть у нас будет следующий список.
29 | 99 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21,44 (high)
Выберем первый элемент как опору 29), а указатель на меньшие элементы (называемый «low») будет следующим элементом, указатель на более крупные элементы (называемый «high») станем последний элемент в списке.
29 | 99 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21 (high),44
Мы двигаемся в сторону high то есть влево, пока не найдем значение, которое ниже нашего опорного элемента.
29 | 99 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21 (high),44
- Теперь, когда наш элемент high указывает на элемент 21, то есть на значение меньше чем опорное значение, мы хотим найти значение в начале массива, с которым мы можем поменять его местами. Нет смысла менять местами значение, которое меньше, чем опорное значение, поэтому, если low указывает на меньший элемент, мы пытаемся найти тот, который будет больше.
- Мы перемещаем переменную low вправо, пока не найдем элемент больше, чем опорное значение. К счастью, low уже имеет значение 89.
- Мы меняем местами low и high:
29 | 21 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,99 (high),44
- Сразу после этого мы перемещает high влево и low вправо (поскольку 21 и 89 теперь на своих местах)
- Опять же, мы двигаемся high влево, пока не достигнем значения, меньшего, чем опорное значение, и мы сразу находим — 12
- Теперь мы ищем значение больше, чем опорное значение, двигая low вправо, и находим такое значение 41
Этот процесс продолжается до тех пор, пока указатели low и high наконец не встретятся в одном элементе:
29 | 21,27,12,19,28 (low/high),44,78,87,66,31,76,58,88,83,97,41,99,44
Мы больше не используем это опорное значение, поэтому остается только поменять опорную точку и high, и мы закончили с этим рекурсивным шагом:
28,21,27,12,19,29,44,78,87,66,31,76,58,88,83,97,41,99,44
Как видите, мы достигли того, что все значения, меньшие 29, теперь слева от 29, а все значения больше 29 справа.
Затем алгоритм делает то же самое для коллекции 28,21,27,12,19 (левая сторона) и 44,78,87,66,31,76,58,88,83,97,41,99,44 (правая сторона). И так далее.
Сортировка данных вставками
Эта сортировка работает путём прохождения по массиву и перемещения нужного значения в его начало
Важно помнить, что сортировка обрабатывает элементы массива по порядку. Т
к. алгоритм работает слева направо, становится очевидно, что всё, что находится слева от текущего индекса, — отсортировано. Давайте посмотрим на увеличение отсортированной части массива с каждым последующим проходом:
По ходу работы отсортированная часть массива растёт, таким образом, в конечном итоге, массив становится упорядоченным.
Приведём пример. Вот неотсортированный массив:
Алгоритм сортировки начнёт работать с индекса «ноль» и значения «три». Т. к. это 1-й индекс, массив до него включительно будет считаться уже отсортированным.
Потом перейдём к семёрке. Семь больше любого значения в отсортированной части, значит, осуществляется переход к последующему элементу. Отметим, что на прошедшем этапе были отсортированы компоненты с индексами 0..1, про компоненты с индексами 2..n мы пока ничего не знаем.
Теперь алгоритм проверяет четвёрку. Четыре меньше, чем 7, поэтому переносится на другую, более правильную позицию, которая находится в отсортированной части массива. Позиция определяется методом FindInsertionIndex. Метод сравнивает переданное значение (в нашем случае это 4) с каждым значением из отсортированной части и так до тех пор, пока не будет найдено место для вставки.
Так для вставки был определён индекс 1. Вставка осуществляется методом Insert. Вставляемое значение удаляется из массива, все остальные цифры сдвигаются вправо, начиная с индекса для вставки. Вот как стал выглядеть массив после сортировки:
Итог работы алгоритма сортировки вставками очевиден:
public void Sort(T[] items) { int sortedRangeEndIndex = 1; while (sortedRangeEndIndex < items.Length) { if (itemssortedRangeEndIndexCompareTo(itemssortedRangeEndIndex - 1]) < ) { int insertIndex = FindInsertionIndex(items, itemssortedRangeEndIndex]); Insert(items, insertIndex, sortedRangeEndIndex); } sortedRangeEndIndex++; } } private int FindInsertionIndex(T[] items, T valueToInsert) { for (int index = ; index < items.Length; index++) { if (itemsindexCompareTo(valueToInsert) > ) { return index; } } throw new InvalidOperationException("The insertion index was not found"); } private void Insert(T[] itemArray, int indexInsertingAt, int indexInsertingFrom) { // itemArray = 0 1 2 4 5 6 3 7 // insertingAt = 3 // insertingFrom = 6 // // Действия: // 1: Сохраняем текущий индекс в temp // 2: Меняем indexInsertingAt на indexInsertingFrom // 3: Меняем indexInsertingAt на indexInsertingFrom в позиции +1 // Сдвигаем элементы влево на один. // 4: Записываем temp на позицию в массиве + 1. // Шаг 1. T temp = itemArrayindexInsertingAt]; // Шаг 2. itemArrayindexInsertingAt = itemArrayindexInsertingFrom]; // Шаг 3. for (int current = indexInsertingFrom; current > indexInsertingAt; current--) { itemArraycurrent = itemArraycurrent - 1]; } // Шаг 4. itemArrayindexInsertingAt + 1 = temp; }
How Bubble Sort Works?
We take an unsorted array for our example. Bubble sort takes Ο(n2) time so we’re keeping it short and precise.
Bubble sort starts with very first two elements, comparing them to check which one is greater.
In this case, value 33 is greater than 14, so it is already in sorted locations. Next, we compare 33 with 27.
We find that 27 is smaller than 33 and these two values must be swapped.
The new array should look like this −
Next we compare 33 and 35. We find that both are in already sorted positions.
Then we move to the next two values, 35 and 10.
We know then that 10 is smaller 35. Hence they are not sorted.
We swap these values. We find that we have reached the end of the array. After one iteration, the array should look like this −
To be precise, we are now showing how an array should look like after each iteration. After the second iteration, it should look like this −
Notice that after each iteration, at least one value moves at the end.
And when there’s no swap required, bubble sorts learns that an array is completely sorted.
Now we should look into some practical aspects of bubble sort.
Implementing Bubble Sort Algorithm
Following are the steps involved in bubble sort(for sorting a given array in ascending order):
- Starting with the first element(index = 0), compare the current element with the next element of the array.
- If the current element is greater than the next element of the array, swap them.
- If the current element is less than the next element, move to the next element. Repeat Step 1.
Let’s consider an array with values
Below, we have a pictorial representation of how bubble sort will sort the given array.
So as we can see in the representation above, after the first iteration, is placed at the last index, which is the correct position for it.
Similarly after the second iteration, will be at the second last index, and so on.
Time to write the code for bubble sort:
Although the above logic will sort an unsorted array, still the above algorithm is not efficient because as per the above logic, the outer loop will keep on executing for 6 iterations even if the array gets sorted after the second iteration.
So, we can clearly optimize our algorithm.
Алгоритм
Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N−1{\displaystyle N-1} раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим «наибольшим элементом», а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции, как пузырёк в воде. Отсюда и название алгоритма).
Пример работы алгоритма
Возьмём массив с числами «5 1 4 2 8» и отсортируем значения по возрастанию, используя сортировку пузырьком. Выделены те элементы, которые сравниваются на данном этапе.
Наглядная демонстрация алгоритма.
Первый проход:
- (5 1 4 2 8) (1 5 4 2 8), Здесь алгоритм сравнивает два первых элемента и меняет их местами.
- (1 5 4 2 8) (1 4 5 2 8), Меняет местами, так как 5>4{\displaystyle 5>4}
- (1 4 5 2 8) (1 4 2 5 8), Меняет местами, так как 5>2{\displaystyle 5>2}
- (1 4 2 5 8) (1 4 2 5 8), Теперь, ввиду того, что элементы стоят на своих местах (8>5{\displaystyle 8>5}), алгоритм не меняет их местами.
Второй проход:
- (1 4 2 5 8) (1 4 2 5 8)
- (1 4 2 5 8) (1 2 4 5 8), Меняет местами, так как 4>2{\displaystyle 4>2}
- (1 2 4 5 8) (1 2 4 5 8)
Теперь массив полностью отсортирован, но алгоритму это неизвестно. Поэтому ему необходимо сделать полный проход и определить, что перестановок элементов не было.
Третий проход:
- (1 2 4 5 8) (1 2 4 5 8)
- (1 2 4 5 8) (1 2 4 5 8)
Теперь массив отсортирован и алгоритм может быть завершён.
Implementing the Bubble Sort Algorithm
We will breakdown the implementation into three (3) steps, namely the problem, the solution, and the algorithm that we can use to write code for any language.
The problem
A list of items is given in random order, and we would like to arrange the items in an orderly manner
Consider the following list:
The solution
Iterate through the list comparing two adjacent elements and swapping them if the first value is higher than the second value.
The result should be as follows:
Algorithm
The bubble sort algorithm works as follows
Step 1) Get the total number of elements. Get the total number of items in the given list
Step 2) Determine the number of outer passes (n — 1) to be done. Its length is list minus one
Step 3) Perform inner passes (n — 1) times for outer pass 1. Get the first element value and compare it with the second value. If the second value is less than the first value, then swap the positions
Step 4) Repeat step 3 passes until you reach the outer pass (n — 1). Get the next element in the list then repeat the process that was performed in step 3 until all the values have been placed in their correct ascending order.
Step 5) Return the result when all passes have been done. Return the results of the sorted list
Step 6) Optimize Algorithm
Avoid unnecessary inner passes if the list or adjacent values are already sorted. For example, if the provided list already contains elements that have been sorted in ascending order, then we can break the loop early.
Complexity Analysis of Bubble Sort
There are three types of Complexity are:
1) Sort complexity
The sort complexity is used to express the amount of execution times and space that it takes to sort the list. The bubble sort makes (n – 1) iterations to sort the list where n is the total number of elements in the list.
2) Time complexity
The time complexity of the bubble sort is O(n2)
The time complexities can be categorized as:
- Worst case – this is where the list provided is in descending order. The algorithm performs the maximum number of executions which is expressed as O(n2)
- Best case – this occurs when the provided list is already sorted. The algorithm performs the minimum number of executions which is expressed as ?(n)
- Average case – this occurs when the list is in random order. The average Complexity is represented as ?(n2)
3) Space complexity
The space complexity measures the amount of extra space that is needed for sorting the list. The bubble sort only requires one (1) extra space for the temporal variable used for swapping values. Therefore, it has a space complexity of O (1).
Summary
- The bubble sort algorithm works by comparing two adjacent values and swapping them if the value on the left is less than the value on the right.
- Implementing a bubble sort algorithm is relatively straight forward with Python. All you need to use are for loops and if statements.
- The problem that the bubble sort algorithm solves is taking a random list of items and turning it into an ordered list.
- The bubble sort algorithm in data structure performs best when the list is already sorted as it performs a minimal number of iterations.
- The bubble sort algorithm does not perform well when the list is in reverse order.
- The bubbler sort has a time complexity of O (n2) and a space complexity of O (1)
- The bubbler sort algorithm is best suited for academic purposes and not real-world applications.
- The optimized bubble sort makes the algorithm more efficient by skipping unnecessary iterations when checking values that have already been sorted.
Программа
Программа, в которой сначала необходимо ввести размер одномерного массива, после чего массив заполняется случайными числами и сортируется методом пузырька
// bu_sort.cpp: определяет точку входа для консольного приложения.
1 #include "stdafx.h" 2 #include <iostream> 3 using std::cout; 4 using std::cin; 5 using std::endl; 6 7 const int n = 100; 8 9 void Swap(int &x,int &y) 10 { 11 x = x + y; 12 y = x - y; 13 x = x - y; 14 } 15 16 void Bubble_Sort(int *a, int LeanghtArray) 17 { 18 for (int i = 1; i < LeanghtArray-1; ++i){ 19 for (int i2 = 1; i2 < LeanghtArray-1; ++i2){ 20 if (ai2 > ai2+1]){ 21 Swap(ai2], ai2+1]); 22 } 23 } 24 } 25 } 26 27 28 int _tmain(int argc, _TCHAR* argv[]) 29 { 30 int an], a1n], i, i2; 31 for (int i = 1; i < n; i++){ ai = rand(); a1i = ai]; } 32 33 Bubble_Sort(a, n); 34 35 for (int i = 1; i < n; i++){ cout << ai <<" "<<a1i<<endl; } 36 cin >> i; 37 return ; 38 }
Пример работы алгоритма
Возьмём массив с числами «5 1 4 2 8» и отсортируем значения по возрастанию, используя сортировку пузырьком. Выделены те элементы, которые сравниваются на данном этапе.
Наглядная демонстрация алгоритма.
Первый проход:
- (5 1 4 2 8) (1 5 4 2 8), Здесь алгоритм сравнивает два первых элемента и меняет их местами.
- (1 5 4 2 8) (1 4 5 2 8), Меняет местами, так как 5>4{\displaystyle 5>4}
- (1 4 5 2 8) (1 4 2 5 8), Меняет местами, так как 5>2{\displaystyle 5>2}
- (1 4 2 5 8) (1 4 2 5 8), Теперь, ввиду того, что элементы стоят на своих местах (8>5{\displaystyle 8>5}), алгоритм не меняет их местами.
Второй проход:
- (1 4 2 5 8) (1 4 2 5 8)
- (1 4 2 5 8) (1 2 4 5 8), Меняет местами, так как 4>2{\displaystyle 4>2}
- (1 2 4 5 8) (1 2 4 5 8)
Теперь массив полностью отсортирован, но алгоритму это неизвестно. Поэтому ему необходимо сделать полный проход и определить, что перестановок элементов не было.
Третий проход:
- (1 2 4 5 8) (1 2 4 5 8)
- (1 2 4 5 8) (1 2 4 5 8)
Теперь массив отсортирован и алгоритм может быть завершён.
What is Bubble Sort
Bubble sort is one of the easiest and brute force sorting algorithm. It is used to sort elements in either ascending or descending order. Every element is compared with every other element in bubble sort.
It basically does swapping of elements if they are not in the right order depending on their value and the intended order. A nested loop will be used to implement this algorithm.
Bubble Sort Pseudocode
- We are given with an input array which is supposed to be sorted in ascending order
- We start with the first element and i=0 index and check if the element present at i+1 is greater then we swap the elements at index i and i+1.
- If above is not the case, then no swapping will take place.
- Now “ i ” gets incremented and the above 2 steps happen again until the array is exhausted.
- We will ignore the last index as it is already sorted.
- Now the largest element will be at the last index of the array.
- Now we will again set i=0 and continue with the same steps that will eventually place second largest at second last place in the array. Now the last 2 indexes of the array are sorted.
input:
1 | 2 | 3 | 4 | |
23 | 10 | 16 | 11 | 20 |
After i=0
1 | 2 | 3 | 4 | |
10 | 16 | 11 | 20 | 23 |
After i=1
1 | 2 | 3 | 4 | |
10 | 11 | 16 | 20 | 23 |
After i=2
1 | 2 | 3 | 4 | |
10 | 11 | 16 | 20 | 23 |
After i=3
1 | 2 | 3 | 4 | |
10 | 11 | 16 | 20 | 23 |
After i=4
1 | 2 | 3 | 4 | |
10 | 11 | 16 | 20 | 23 |
Bubble Sort Time Complexity
- Each and every element is compared with the other elements for array which takes n time
- And the above steps continues for n iterations
- Best Time Complexity: O(n^2)
- Average Time Complexity: O(n^2)
- Worst Time Complexity: O(n^2)
Bubble Sort Space Complexity
- No auxiliary space is required in bubble sort implementation
- Hence space complexity is: O(1)
Now we are going to implement Bubble sort in different programming languages such as C,C++, Python, and Java
Output of the program: