Сортировка выбором (2 в 1) - C (СИ)
Формулировка задачи:
Пишу вот сортировку... выбором
Должна быть по возрастанию и убыванию.. !
имеем две функции сортировки (была взята гдето в гугле, изначально она была во возрастанию - ASC, переделал в DESC (ну или наоборот, не суть важно) - они работают, проверял
и тут надо сделать так, чтобы это была одна функция.. провернул тему с параметром:
я знаю, что я поиздевался с языком C, но может ктонибудь чтонибудь посоветует?
void selectionsort_ASC(int *array, int n) { int last, i, biggest, tmp; for(last=n-1; last >= 0; last--) { biggest=last; for(i=last-1; i >= 0; i--) { if(array[i]<array[biggest]) biggest = i; } tmp = array[last]; array[last] = array[biggest]; array[biggest] = tmp; } } void selectionsort_DESC(int *array, int n) { int first, i, smallest, tmp; for(first=0; first<n-1; first++) { smallest=first; for(i=first+1; i<n; i++) { if(array[i]<array[smallest]) smallest = i; } tmp = array[first]; array[first] = array[smallest]; array[smallest] = tmp; } }
void selectionsort_ASC(int *array, int n, int p) { int begin, end, last, i, biggest, tmp, current, begin_s, end_s; if (p == 1) { begin = n-1; end = 0; } if (p == 2) { begin = 0; end = n-1; } for(last=begin; last = end;) { current=last; if (p == 1) { begin_s = last - 1; end_s = 0; } if (p == 2) { begin_s = current+1; end_s = n-2; } for(i=begin_s; i = end_s;) { if(array[i]<array[biggest]) biggest = i; if (p==1) { i--; } if (p==2) { i++; } } tmp = array[last]; array[last] = array[biggest]; array[biggest] = tmp; if (p==1) { last--; } if (p==2) { last++; } } }
Решение задачи: «Сортировка выбором (2 в 1)»
textual
Листинг программы
void selectionsort_ASC_DESC(int *array, int n, int p) { int begin, end, last, iter, i, tmp, current, end_s; if (p == 1) { begin = 0; end = n-1; iter = 1; end_s = n ;} if (p == 2) { begin = n-1; end = 0; iter = -1; end_s = -1;} last = begin; while(last != end) { current = last; i = last + iter; while(i != end_s) { if(array[i]<array[current]) current = i; i += iter; } tmp = array[last]; array[last] = array[current]; array[current] = tmp; last+=iter; } }
Объяснение кода листинга программы
- В данной функции реализован алгоритм сортировки выбором, который предполагает нахождение в каждой итерации наименьшего элемента в неотсортированной части массива и его перемещение в начало этой части
- Присваиваем переменным значения для удобства работы с ними в коде: — begin — инициализируется значением 0, указывает на первый элемент массива, с которого начинается отбор — end — инициализируется значением n-1, указывает на последний элемент массива, после которого идет уже отсортированная часть — last — инициализируется значением begin — iter — инициализируется значением 1, используется для перемещения по неотсортированной части массива — current — инициализируется значением last, в этой переменной хранится текущий элемент, с которым сравниваются остальные элементы неотсортированной части массива — end_s — инициализируется значением n, используется для перемещения по неотсортированной части массива
- В зависимости от значения параметра p, который определяет направление сортировки (1 - по возрастанию, 2 - по убыванию), изменяются значения переменных begin, end, iter, end_s
- Запускаем цикл while, который выполняется до тех пор, пока неотсортированная часть массива не будет полностью отсортирована
- В каждой итерации цикла: — Перемещаем текущий элемент в конец неотсортированной части массива — Используем переменную i для перемещения по неотсортированной части массива — Вложенный цикл while выполняет поиск наименьшего элемента в неотсортированной части массива — Если найденный элемент меньше текущего, то он становится новым текущим элементом — Перемещаем текущий элемент на его законное место в отсортированной части массива — Последний элемент неотсортированной части массива перемещается в начало отсортированной части массива
- Возвращаем отсортированный массив
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д