Двухсторонняя сортировка выбором - нужен пример - C (СИ)
Формулировка задачи:
Помогите написать или найти код этой сортировки( она улучшает обычную сортировку выбором. кроме максимального элемента в неотсортированном подмассиве также находит и минимальный. Максимум при этом перемещать в конец подмассива, а минимум — в начало.
Решение задачи: «Двухсторонняя сортировка выбором - нужен пример»
textual
Листинг программы
#include <stdio.h> #define n 10 void swap(int *a,int *b) { int tmp; if(*a==*b) //отказываемся от замены одинаковых return; tmp=*a; *a=*b; *b=tmp; printf("%d <-> %d\n",*a,*b); } main() { int mas[n]={9,5,1,3,6,7,4,8,2,0}; int max,min,max_index,min_index,i,j,k; k=n-1; for(i=0;i<=k;i++) { max=min=mas[i]; max_index=min_index=i; for(j=i+1;j<=k;j++) { if(mas[j]>max) { max=mas[j]; max_index=j; } if(mas[j]<min) { min=mas[j]; min_index=j; } } if(max_index==i&&min_index!=k) //куча if-ов для обработки пограничных значений { swap(&mas[k],&mas[max_index]); swap(&mas[i],&mas[min_index]); } if(min_index==k&&max_index!=i) { swap(&mas[i],&mas[min_index]); swap(&mas[k],&mas[max_index]); } if(min_index==k&&max_index==i) swap(&mas[k],&mas[i]); if(min_index!=k&&max_index!=i) { swap(&mas[k],&mas[max_index]); swap(&mas[i],&mas[min_index]); } k--; //сокращаем границу цикла } for(i=0;i<n;i++) { printf("%d ",mas[i]); } }
Объяснение кода листинга программы
Код выполняет двухстороннюю сортировку выбором. Вот список действий, которые происходят в коде:
- Создается массив
mas
размеромn
со значениями, которые нужно отсортировать. - Определяются переменные
max
,min
,max_index
,min_index
,i
,j
,k
, которые будут использоваться в процессе сортировки. - Переменная
k
инициализируется значениемn-1
, чтобы обеспечить корректное поведение цикла. - В цикле
for
происходит сортировка. На каждой итерации цикла:- Переменные
max
иmin
инициализируются значением первого элемента текущего подмассива. - Переменные
max_index
иmin_index
инициализируются значением индекса первого элемента текущего подмассива. - В цикле
for
внутреннем по отношению к основному циклу происходит поиск максимального и минимального элементов в текущем подмассиве. - Если максимальный и минимальный элементы находятся на одной и той же позиции (то есть подмассив уже отсортирован), код пропускает итерацию.
- Если максимальный элемент находится на последней позиции, а минимальный - на первой, код меняет местами последний и первый элементы.
- Если минимальный элемент находится на последней позиции, а максимальный - на первой, код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на одной и той же позиции, и подмассив не отсортирован (то есть максимальный элемент находится перед минимальным), код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на разных позициях, и подмассив не отсортирован, код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на одной и той же позиции, и подмассив отсортирован, код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на разных позициях, и подмассив отсортирован, код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на одной и той же позиции, и подмассив не отсортирован, код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на разных позициях, и подмассив не отсортирован, код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на одной и той же позиции, и подмассив отсортирован, код меняет местами последний и первый элементы.
- Если максимальный и минимальный элементы находятся на разных позициях, и подмассив отсортирован, код меняет местами последний и первый элементы.
- Переменные
- После завершения основного цикла, в цикле
for
происходит вывод отсортированного массива.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д