Это вообще не пузырёк, а подобный ему, но другой алгоритм. Пузырёк выглядит так:
Код: Выделить всё
for (i=0; i<n-1; ++i)
{
for (j=i+1; j<n; ++j)
{
if (a[i]>a[j])
{
b=a[i];
a[i]=a[j];
a[j]=b;
}
}
}
. Внешний цикл перебирает индекс элемента, завершающего часть массива, которая в конце шага этого цикла будет отсортирована, внутренний цикл перебирает кандидатов на перестановку в начало части массива, начинающейся с элемента, чей индекс перебирает внешний цикл. Можно оптимизировать сравнение:
1. Заранее вычислив n-1.
2.
Код: Выделить всё
for (i=n-1; i>0; --i)
{
for (j=i-1; j>=0; --j)
{
if (a[j]>a[i])
{
b=a[i];
a[i]=a[j];
a[j]=b;
}
}
}
. Массив перевёрнут, отсортированная часть растёт от его конца к началу, соответственно внешний цикл перебирает индекс элемента, который в конце шага этого цикла будет начинать отсортированную часть,
соответственно во внутреннем цикле перебираются кандидаты на перестановку в конец части массива, завершаемой элементом, чей индекс перебирается внешним циклом. При беззнаковом индексе вместо
пишется
.
3.
Код: Выделить всё
for (i=0; i<n; ++i)
{
for (j=i+1; j<n; ++j)
{
if (a[i]>a[j])
{
b=a[i];
a[i]=a[j];
a[j]=b;
}
}
}
. Внешний цикл один раз доходит до последнего элемента, на последнем шаге внутренний цикл не запускается, соответственно шаг внешнего цикла завершается, ничего не сделав, но зато сравнение происходит без сложения каждый раз. Величина n должна быть строго меньше максимально представимой, иначе в теле внешнего цикла нужен ещё и if для защиты от переполнения индекса внутреннего цикла, что полностью компенсирует оптимизацию и даже может пессимизировать код.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.