Сортировка слиянием - C (СИ) (147654)

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

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

Здравствуйте, у меня есть функция выполняющая сортировку слиянием.
void mergesort(long num, float a[])
{
    int rght, rend;
    int i, j, m;
 
    for (int k = 1; k < num; k *= 2)
    {
        for (int left = 0; left + k < num; left += k * 2)
        {
            rght = left + k;
            rend = rght + k;
            if (rend > num) rend = num;
            m = left; i = left; j = rght;
            while (i < rght && j < rend)
            {
                if (a[i] <= a[j])
                {
                    b[m] = a[i]; i++;
                }
                else
                {
                    b[m] = a[j]; j++;
                }
                m++;
            }
            while (i < rght)
            {
                b[m] = a[i];
                i++; m++;
            }
            while (j < rend)
            {
                b[m] = a[j];
                j++; m++;
            }
            for (m = left; m < rend; m++)
            {
                a[m] = b[m];
            }
        }
    }
}
Всё прекрасно работает, но у меня есть необходимость в том, чтобы все нули, если они есть, которые находятся в начале находились в конце массива. Как мне это реализовать?

Решение задачи: «Сортировка слиянием»

textual
Листинг программы
void correct(int n, int * arr) // n - число элементов в массиве, arr - массив
{
    int buf;
    for(int i = 0; i < n; ++i)
    {
        if(arr[i]){return;}
        buf = arr[n - i];
        arr[n - i] = 0;
        arr[i] = buf;
    }
    return;
}

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

В данном коде реализована функция correct, которая выполняет сортировку массива методом слияния.

  1. В первой строке объявлена переменная buf, которая будет использоваться как временное хранилище для элементов массива.
  2. Далее, в цикле for, который выполняется столько раз, сколько элементов в массиве, происходит проверка: если элемент arr[i] не равен нулю, то функция correct сразу же возвращает управление. Это необходимо для того, чтобы функция не выполняла лишних операций, если массив уже отсортирован.
  3. Внутренний блок кода в цикле for выполняет следующие действия:
    • Перемещает последний ненулевой элемент массива в буфер buf.
    • Устанавливает значение arr[n-i] равным нулю, тем самым отсекая отсортированную часть массива.
    • Устанавливает значение arr[i] равным buf, то есть последнему ненулевому элементу.
  4. После завершения цикла, если все элементы массива были равны нулю, функция correct возвращает управление. Таким образом, функция correct выполняет сортировку массива методом слияния, разделяя массив на две части: отсортированную и неотсортированную, и затем объединяет их в одну отсортированную последовательность.

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


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

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

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