Двухсторонняя сортировка выбором - нужен пример - 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происходит вывод отсортированного массива.