Сортировка Шелла - 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, которые определяют порядок элементов для сортировки методом простого обмена. Код также содержит проверку на пустой или не созданный массив перед сортировкой и выводит сообщение об ошибке в случае обнаружения такого массива.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д