Сортировка слиянием - 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, которая выполняет сортировку массива методом слияния.
- В первой строке объявлена переменная buf, которая будет использоваться как временное хранилище для элементов массива.
- Далее, в цикле for, который выполняется столько раз, сколько элементов в массиве, происходит проверка: если элемент arr[i] не равен нулю, то функция correct сразу же возвращает управление. Это необходимо для того, чтобы функция не выполняла лишних операций, если массив уже отсортирован.
- Внутренний блок кода в цикле for выполняет следующие действия:
- Перемещает последний ненулевой элемент массива в буфер buf.
- Устанавливает значение arr[n-i] равным нулю, тем самым
отсекаяотсортированную часть массива. - Устанавливает значение arr[i] равным buf, то есть последнему ненулевому элементу.
- После завершения цикла, если все элементы массива были равны нулю, функция correct возвращает управление. Таким образом, функция correct выполняет сортировку массива методом слияния, разделяя массив на две части: отсортированную и неотсортированную, и затем объединяет их в одну отсортированную последовательность.