Сортировка Шелла - C (СИ) (154597)
Формулировка задачи:
Помогите пожалуйста исправить ошибки в программе.Она запускается,но после ввода строки вылетает и не сортирует её.
#include <stdio.h>
#include <stdlib.h>
int BubbleSort(int *tmp,int len)
{
int i,j,c;
int k=0;
for (i=len;i>1;i--)
{
k=0;
if (tmp[j]<tmp[j-1])
for (j=1;j<i;j++)
{
c=tmp[j];
tmp[j]=tmp[j-1];
tmp[j-1]=c;
k=1;
}
if (k==0) return 0;
}
}
int ShellSort(int *tmp,int len)
{
long d=len,i,j;
int c;
do
{
d=d/2;
i=0;
while ((j=i+d)<len)
{
if (tmp[i]>tmp[j])
{
c=tmp[i];
tmp[i]=tmp[j];
tmp[j]=c;
}
i++;
}
}
while (d>1);
BubbleSort(tmp,len);
}
int main()
{ int i;
int k[10];
puts("Введите строку");
gets(k);
for ( i=0; i<10;i++)
printf(" %d ",k[i]);
printf("\n");
ShellSort(k,10);
for (i=0; i<10;i++)
printf(" %d ",k[i]);
printf("\n");
return 0;
}Решение задачи: «Сортировка Шелла»
textual
Листинг программы
void shell(int* array, int kol)
{
if(array==NULL || *array == NULL)
printf("Массив пуст или не создан! Сортировка невозможна!!!\n");
else
{
int g[5]={5,4,3,2,1};
int m;
int j;
for(int k=0; k<5; k++)
{
g=r[k];
for(int i=g; i < kol; ++i)
{
m = array[i];
for(j=i-g; (m > array[j]) && (j >= 0); j=j-g)
array[j+g] = array[j];
array[j+g] = m;
}
}
}
}
/*сравнение 2 элементов*/
bool sr_vozr(int value_1, int value_2)
{
if(value_2<value_1)
return true;
else
return false;
}
/*сравнение 2 элементов*/
bool sr_ubivan(int value_1, int value_2)
{
if(value_2>value_1)
return true;
else
return false;
}
/*сортировка методом простого обмена*/
void sort_exchange(int* array, int kol, sravnen point)
{
if(array==NULL )
printf("Массив пуст или не создан! Сортировка невозможна!!!\n");
else
{
for(int i=0; i<kol-1; i++)
{
bool flag=false;
for(int j=1; j<kol; j++)
{
if(point(array[j-1], array[j])==1)
{
int temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
flag=true;
}
}
if(flag==false)
return;
}
}
}
Объяснение кода листинга программы
Код реализует алгоритм сортировки Шелла (Shell sort) и использует функцию сравнения для определения порядка элементов. Список действий:
- Проверка входных данных на корректность (пустой или не созданный массив).
- Инициализация вспомогательного массива g, который используется в процессе сортировки.
- Внешний цикл, который выполняет сортировку. Он проходит по каждому элементу массива g.
- Внутренний цикл, который определяет элементы, которые нужно поменять местами. Он проходит от элемента, находящегося на позиции i-g до конца массива.
- Если текущий элемент больше следующего, то они меняются местами.
- Внутренний цикл продолжается до тех пор, пока не будет выполнено условие остановки (элементы отсортированы).
- Возврат к началу внешнего цикла для следующего шага сортировки.
- После завершения внешнего цикла массив считается отсортированным. В коде также присутствуют функции сравнения sr_vozr и sr_ubivan, которые определяют порядок элементов для сортировки методом простого обмена. Код также содержит проверку на пустой или не созданный массив перед сортировкой и выводит сообщение об ошибке в случае обнаружения такого массива.