Сортировка вставками последовательности элементов, отстоящих друг от друга - C (СИ)
Формулировка задачи:
Можете подробно обьяснить программу???
void shellSort(int a[], int size);
int increment(int inc[], int size);
int main () {
int j,m=0,in_mas[100];
printf("\nVvedite chislo elementov massiva: ");
scanf("%d", &m);
printf("\nVvedite massiv:");
printf("\n");
printf("\n");
for(j = 0; j < m; j++) {
scanf("%d", &in_mas[j]);
}
shellSort(in_mas, m);
printf ("\n");
printf ("\n");
}
void shellSort(int a[], int size) {
int inc, s, i, j, seq[40];
s = increment(seq, size);
while (s >= 0) {
inc = seq[s--];
for (i = inc; i < size; i++) {
int temp = a[i];
for (j = i-inc; (j >= 0) && (a[j] > temp); j -= inc) {
a[j+inc] = a[j];
}
a[j+inc] = temp;
}
}
printf("\n");
for(i = 0; i < size; ++i) {
printf("%d ", a[i]);
}
}
int increment(int inc[], int size) {
int p1, p2, p3, s;
p1 = p2 = p3 = 1;
s = -1;
do {
if (++s % 2) {
inc[s] = 8*p1 - 6*p2 + 1;
}
else {
inc[s] = 9*p1 - 9*p3 + 1;
p2 *= 2;
p3 *= 2;
}
p1 *= 2;
}
while(3*inc[s] < size);
return s > 0 ? --s : 0;
}Решение задачи: «Сортировка вставками последовательности элементов, отстоящих друг от друга»
textual
Листинг программы
void shellSort(int a[], int size);
int increment(int inc[], int size);
int main ()
{
int j,m=0,in_mas[100];
printf("\nVvedite chislo elementov massiva: ");
scanf("%d", &m);
printf("\nVvedite massiv:");
printf("\n");
printf("\n");
for(j = 0; j < m; j++) scanf("%d", &in_mas[j]);
shellSort(in_mas, m);
printf ("\n");
printf ("\n");
}
void shellSort(int a[], int size)
{
int inc, s, i, j, seq[40];
s = increment(seq, size); /* получение последовательности */
while (s >= 0)
{
/* сортировка вставками последовательности
элементов, отстоящих друг от друга на inc */
inc = seq[s--];
for (i = inc; i < size; i++)
{
int temp = a[i];
for (j = i-inc; (j >= 0) && (a[j] > temp); j -= inc)
{
a[j+inc] = a[j];
}
a[j+inc] = temp;
}
}
printf("\n");
for(i = 0; i < size; ++i) printf("%d ", a[i]);
}
/* Построение последовательности */
int increment(int inc[], int size)
{
int p1, p2, p3, s;
p1 = p2 = p3 = 1;
s = -1;
do
{
if (++s % 2)
{
inc[s] = 8*p1 - 6*p2 + 1;
}
else
{
inc[s] = 9*p1 - 9*p3 + 1;
p2 *= 2;
p3 *= 2;
}
p1 *= 2;
} while(3*inc[s] < size);
return s > 0 ? --s : 0;
}