Я пытался реализовать свой собственный алгоритм сортировки пузырьков, не глядя на какой-либо псевдокод онлайн, но теперь, когда я успешно это сделал, мой код выглядит действительно отличным от примеров, которые я вижу в Интернете. Все они связаны с заменой переменной, которая является либо истинной, либо ложной. Моя реализация не включает это вообще, так же, как я НЕ сделал вид пузыря?Есть ли только один способ реализовать алгоритм сортировки пузырьков?
Вот пример, который я вижу на сайте:
for i = 1:n,
swapped = false
for j = n:i+1,
if a[j] < a[j-1],
swap a[j,j-1]
swapped = true
→ invariant: a[1..i] in final position
break if not swapped
конец
Вот моя реализация этого:
void BubbleSort(int* a, int size)
{
while (!arraySorted(a, size))
{
int i = 0;
while (i < (size-1))
{
if (a[i] < a[i+1])
{
i++;
}
else
{
int tmp = 0;
tmp = a[i+1];
a[i+1] = a[i];
a[i] = tmp;
i++;
}
}
}
}
Это делает ту же работу, но она делает это любой иначе?
Ваша версия в два раза медленнее, потому что 'arraySorted' стоит столько же, сколько итерация тела цикла. –
@ Раймонд Чен. Итак, в основном переменная с заменой абсолютно необходима? – FrostyStraw
Вы поняли, что позади пары индексов идет поход по последовательности? В * любом * заданном проходе, если не происходит никаких свопов для любых смежных элементов, последовательность сортируется по определению, и все готово. Обнаружение того, что произошел обмен, а значит, необходим другой проход, является основной причиной этого флага. – WhozCraig