Составители:
Рубрика:
void sort_insert1 (int A[], int n)
{
for ( int i=1; i < n; i++)
{
int buf=A[i]; // Действие 1: сохранить очередной элемент
for (int k=0; k<i; k++) // Действие 2: поиск места вставки
if(A[k]>buf) break; // перед первым элементом, большим buf
for(int j=i-1; j>=k; j--) // Действие 3: сдвиг на 1 элемент вправо
A[j+1]=A[j];
A[k]=buf; //Действие 4: вставка очередного элемента
} // на место первого, который больше его
}
Вставка погружением. Очередной элемент «погружается» путем ряда обменов с
предыдущим до требуемой позиции в уже упорядоченную часть массива, пока «не дос-
тигнет дна» либо пока не встретит элемент, меньше себя.
void sort_insert2(int A[], int n)
{
for ( int i=1; i<n; i++)
// Пока не достигли "дна" или элемента, меньше себя
for ( int k=i; k !=0 && A[k] < A[k-1]; k--)
{
int buf=A[k],
A[k]=A[k-1];
A[k-1]=buf;
}
}
Сортировка Шелла. Существенными в сортировках вставками являются затраты
на обмены или сдвиги элементов. Для их уменьшения желательно сначала производить
погружение с большим шагом, сразу определяя элемент «по месту», а затем делать точ-
ную «подгонку». Так реализовано в сортировке Шелла: исходный массив разбивается на
m частей, в каждую из которых попадают элементы с шагом m, начиная от 0, 1,..., m-1
соответственно, то есть
0 , m , 2m , 3m ,...
1 , m+1, 2m+1, 3m+1,...
2 , m+2, 2m+2, 3m+2,...
Каждая часть сортируется отдельно с использованием алгоритма вставок или об-
мена. Затем выбирается меньший шаг, и алгоритм повторяется. Шаг удобно выбрать
равным степеням 2, например, 64, 32, 16, 8, 4, 2, 1. Последняя сортировка выполняется с
шагом 1. Несмотря на увеличение числа циклов, суммарное число перестановок будет
меньшим. Принцип сортировки Шелла можно применить и во всех обменных сортиров-
ках. Следует отметить, что сортировка Шелла требует четырех вложенных циклов:
-
1-й по шагу сортировки (по уменьшающимся степеням 2 - m = 64, 32, 16 ...);
-
2-й по группам (по индексу первого элемента в диапазоне k = 0 ... m-1);
-
еще два цикла обычной сортировки погружением для элементов группы, начинаю-
щейся с k с шагом m.
Для двух последних циклов нужно взять базовый алгоритм, заменив шаг 1 на m и
поменяв границы сортировки.
47
void sort_insert1 (int A[], int n)
{
for ( int i=1; i < n; i++)
{
int buf=A[i]; // Действие 1: сохранить очередной элемент
for (int k=0; kbuf) break; // перед первым элементом, большим buf
for(int j=i-1; j>=k; j--) // Действие 3: сдвиг на 1 элемент вправо
A[j+1]=A[j];
A[k]=buf; //Действие 4: вставка очередного элемента
} // на место первого, который больше его
}
Вставка погружением. Очередной элемент «погружается» путем ряда обменов с
предыдущим до требуемой позиции в уже упорядоченную часть массива, пока «не дос-
тигнет дна» либо пока не встретит элемент, меньше себя.
void sort_insert2(int A[], int n)
{
for ( int i=1; iСтраницы
- « первая
- ‹ предыдущая
- …
- 45
- 46
- 47
- 48
- 49
- …
- следующая ›
- последняя »
