Сьогодні | Разом | |
Відвідувань | 42 | 5273716 |
Авторізацій | 0 | 423086 |
Користувачів | 0 | 2728 |
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. Быстрая сортировка без рекурсии.