Сортировка Шелла - 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) и использует функцию сравнения для определения порядка элементов. Список действий:

  1. Проверка входных данных на корректность (пустой или не созданный массив).
  2. Инициализация вспомогательного массива g, который используется в процессе сортировки.
  3. Внешний цикл, который выполняет сортировку. Он проходит по каждому элементу массива g.
  4. Внутренний цикл, который определяет элементы, которые нужно поменять местами. Он проходит от элемента, находящегося на позиции i-g до конца массива.
  5. Если текущий элемент больше следующего, то они меняются местами.
  6. Внутренний цикл продолжается до тех пор, пока не будет выполнено условие остановки (элементы отсортированы).
  7. Возврат к началу внешнего цикла для следующего шага сортировки.
  8. После завершения внешнего цикла массив считается отсортированным. В коде также присутствуют функции сравнения sr_vozr и sr_ubivan, которые определяют порядок элементов для сортировки методом простого обмена. Код также содержит проверку на пустой или не созданный массив перед сортировкой и выводит сообщение об ошибке в случае обнаружения такого массива.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5