Поменять тип сортировки с пузырька на шелла/ вставки - C (СИ)
Формулировка задачи:
Есть прога, которая соритрует массив из файла методом пузырька. Надо поменять тип сортировки на Шелла или вставки. Какие варианты?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
int main(void)
{
int j,i,n,q;
int *x=NULL;
FILE *f=NULL;
f=fopen("C:/c/output.txt","r");
if(!f)
{
printf("Cannot open\n");
return -2;
}
if(fscanf(f,"%d",&n)!=1)
{
printf("Cannot read\n");
return -1;
}
printf("n=%d\n\n",n);
x=(int *)malloc(n*sizeof(int));
for(i=1;i<=n;i++)
{ if(fscanf(f,"%d",&x[i])!=1)
{
printf("Kol-vo elementov ne ravno n!\n");
return 1;
}
}
for(i=1;i<=n;i++)
printf("x[%d]=%d\n",i,x[i]);
printf("\n");
for(i=1;i<=n;i++)
for(j=1;j<=n-1;j++)
if(x[j]>x[j+1])
{
q=x[j];
x[j]=x[j+1];
x[j+1]=q;
}
for(i=1;i<=n;i++)
{
printf("x[%d]=%d\n",i,x[i]);
}
getch();
return 0;
}Решение задачи: «Поменять тип сортировки с пузырька на шелла/ вставки»
textual
Листинг программы
#include <stdio.h>
//сортировка Шелла
void shell_sort(int* a, int n){
int v, j, i, h, m = n / 9;
for(h = 1; h <= m; h = 1 + 3*h)
;
for(; h > 0; h /= 3){
for(i = h; i < n; ++i){
j = i;
v = a[i];
while((j >= h) && (a[j - h] > v)){
a[j] = a[j - h];
j -= h;
}
a[j] = v;
}
}
}
int main(void){
int i;
int a[] = { 8, 9, 7, 1, 2, 4, 3, 6, 5, 0 };
int n = sizeof(a)/sizeof(a[0]);
shell_sort(a, n);
for(i = 0; i < n; ++i)
printf("%d ", a[i]);
getchar();
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем функцию сортировки Шелла с указанием типа данных и параметров
- Инициализируем переменные: v, j, i, h, m = n / 9
- Задаем цикл для установки значений h, который будет использоваться в сортировке
- Задаем внутренний цикл для каждой итерации внешнего цикла, где i = h, j = i, v = a[i]
- Пока j >= h и a[j-h] > v выполняем следующие действия: a[j] = a[j-h], j -= h
- После выполнения цикла a[j] = v
- Задаем цикл для установки значений h, который будет использоваться в сортировке
- Внутренний цикл для каждой итерации внешнего цикла, где i = h, j = i, v = a[i]
- Пока j >= h и a[j-h] > v выполняем следующие действия: a[j] = a[j-h], j -= h
- После выполнения цикла a[j] = v
- В основной функции определяем массив a и переменную n для его размера
- Вызываем функцию сортировки Шелла с передачей массива a и его размера
- Выводим отсортированный массив на экран
- Завершаем программу