Упорядочить массив: отрицательные элементы в начале массива, потом нулевые, а в конце положительные - C (СИ)
Формулировка задачи:
Задан массив, содержащий N элементов. Требуется переприсвоить его элементы так, чтобы отрицательные элементы оказались в начале массива, нулевые следующими, а в конце положительные. При этом в каждой из групп должен сохраниться исходный порядок элементов.
Помогите пожалуйста :C
Решение задачи: «Упорядочить массив: отрицательные элементы в начале массива, потом нулевые, а в конце положительные»
textual
Листинг программы
#include <stdio.h>
int* array_part(int* f, int* l, int (*pcmp)(int)){
int* p, *i, *j, t;
for(p = i = f; i != l; ++i){
if((*pcmp)(*i)){
for(j = i; j > p; --j){
t = *j;
*j = *(j - 1);
*(j - 1) = t;
}
++p;
}
}
return p;
}
int negative(int n) { return (n < 0); }
int zero(int n) { return (n == 0); }
int main(void){
int* p;
int a[] = { 0, 1, -1, 2, -2, 3, -3, 0, -4, -5, 4, 5, 6, -6, 7, 0, -7 };
int n = sizeof(a)/sizeof(a[0]);
p = array_part(a, a + n, &negative);
p = array_part(p, a + n, &zero);
for(p = &a[0]; p != &a[n]; ++p)
printf("%d ", *p);
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы: iostream.h и algorithm.h
- Объявляем функцию
array_part, которая принимает три аргумента: начало и конец массива и функцию сравнения. Внутри функции объявляем четыре указателя:p,i,jиt. Значениеpменяется в процессе сортировки и указывает на текущий элемент, который нужно сравнить.iиjиспользуются для обмена элементов. - Используем цикл
forдля прохода по всем элементам массива от начала до конца. Внутри цикла проверяем условие с помощью функции сравнения. Если условие истинно, то производим обмен элементов с помощью циклаforв обратном порядке. Значениеpувеличивается на единицу после каждой итерации внешнего цикла. - Объявляем две функции сравнения:
negativeиzero. Функцияnegativeвозвращаетtrue, если число отрицательное, иfalseв противном случае. Функцияzeroвозвращаетtrue, если число равно нулю, иfalseв противном случае. - В функции
mainсоздаем массивaи инициализируем его значениями. Вычисляем размер массива в байтах и количество элементов в массиве. - Сначала сортируем массив по отрицательным элементам, вызывая функцию
array_partи передавая в качестве аргумента функциюnegative. Затем сортируем полученный результат по нулевым элементам, вызывая функциюarray_partи передавая в качестве аргумента функциюzero. - Используем цикл
forдля вывода отсортированного массива на экран. - Возвращаем
0в конце программы, чтобы указать, что программа успешно завершилась.