Сортировка выбором (2 в 1) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пишу вот сортировку... выбором Должна быть по возрастанию и убыванию.. ! имеем две функции сортировки (была взята гдето в гугле, изначально она была во возрастанию - ASC, переделал в DESC (ну или наоборот, не суть важно) - они работают, проверял
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++; }
    }
}
я знаю, что я поиздевался с языком C, но может ктонибудь чтонибудь посоветует?

Решение задачи: «Сортировка выбором (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;
    }
}

Объяснение кода листинга программы

  1. В данной функции реализован алгоритм сортировки выбором, который предполагает нахождение в каждой итерации наименьшего элемента в неотсортированной части массива и его перемещение в начало этой части
  2. Присваиваем переменным значения для удобства работы с ними в коде: — begin — инициализируется значением 0, указывает на первый элемент массива, с которого начинается отбор — end — инициализируется значением n-1, указывает на последний элемент массива, после которого идет уже отсортированная часть — last — инициализируется значением begin — iter — инициализируется значением 1, используется для перемещения по неотсортированной части массива — current — инициализируется значением last, в этой переменной хранится текущий элемент, с которым сравниваются остальные элементы неотсортированной части массива — end_s — инициализируется значением n, используется для перемещения по неотсортированной части массива
  3. В зависимости от значения параметра p, который определяет направление сортировки (1 - по возрастанию, 2 - по убыванию), изменяются значения переменных begin, end, iter, end_s
  4. Запускаем цикл while, который выполняется до тех пор, пока неотсортированная часть массива не будет полностью отсортирована
  5. В каждой итерации цикла: — Перемещаем текущий элемент в конец неотсортированной части массива — Используем переменную i для перемещения по неотсортированной части массива — Вложенный цикл while выполняет поиск наименьшего элемента в неотсортированной части массива — Если найденный элемент меньше текущего, то он становится новым текущим элементом — Перемещаем текущий элемент на его законное место в отсортированной части массива — Последний элемент неотсортированной части массива перемещается в начало отсортированной части массива
  6. Возвращаем отсортированный массив

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


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

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

6   голосов , оценка 4 из 5
Похожие ответы