| Сьогодні | Разом | |
| Відвідувань | 265 | 5403848 |
| Авторізацій | 10 | 434260 |
| Користувачів | 5 | 2731 |
31. Сортировка массивов
32. Пузырьковая сортировка
repeat
count := 0;
for i := 2 to n do
if a[i] < a[i - 1]
then begin
<Обмен значениями a[i] и a[i-1] элементов>
inc(count)
end
until count = 0
Напомним, что при обмене значениями двух элементов массива используется временная переменная:temp := a[i]; a[i] := a[i - 1]; a[i - i] := temp;
33. Улучшение алгоритма пузырьковой сортировки
m := n;
repeat
count := 0;
for i := 2 to m do
if a[i] < a[i - 1]
then begin
<Обмен значениями a[i] и a[i-1] элементов>
inc(count)
end;
dec(m);
until count = 0
Здесь мы ввели в алгоритм новую переменную m, первоначально присвоив ей значение переменной n (количество элементов массива). По завершению очередного прохода по массиву мы уменьшаем значение переменной m. Это несколько ускорит сортировку массива, так как количество попарных сравнений элементов с каждым проходом будет уменьшаться.84. Сортировка вставкой
for i := 2 to n begin
k := i;
// "Продвигаем" k-й элемент к началу массива
while (k > 1) and (a[k] < a[k - 1]) begin
// Меняем местами текущий элемент с впереди стоящим "соседом"
temp := a[k];
a[k] := a[k - 1];
a[k - 1] := temp;
k := k - 1;
end;
end;
C/C++ реализация:
for (int i = 1; i < n; ++i) {
int k = i;
// "Продвигаем" k-й элемент к началу массива
while (k > 0 && a[k] < a[k - 1]) {
// Меняем местами текущий элемент с впереди стоящим "соседом"
int temp = a[k];
a[k] = a[k - 1];
a[k - 1] = temp;
--k;
}
}
90. Быстрая сортировка
void qsort(int* a, int left, int right) {
int l = left, r = right;
int m = a[(left + right) / 2]; // Значение опорного элемента
do {
while (a[l] < a[m])
l++;
while (a[r] > a[m])
r--;
if (l <= r) {
int temp = a[l];
a[l] = a[r];
a[r] = temp;
l++;
r--;
}
} while (l < r);
if (left < r)
qsort(a, left, r);
if (l < right)
qsort(a, l, right);
}
Предлагаемый алгоритм быстрой сортировки относится к так называемым неустойчивым типам сортировки, при котором элементы с одинаковыми значениями могут изменить свое положение в массиве относительно друг друга.91. Быстрая сортировка (2й вариант)
void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
void qsort(int* a, int left, int right) {
int l = left, r = right, m = a[(left + right) / 2];
while (l < r) {
while (a[l] < m)
l++;
while (a[r] > m)
r--;
if (l <= r)
swap(a[l++], a[r--]);
}
if (left < r)
qsort(a, left, r);
if (l < right)
qsort(a, l, right);
}
189. Быстрая сортировка без рекурсии.