Отрицательные элементы массива отсортировать в порядке возрастания - C (СИ)
Формулировка задачи:
дана задачка: есть вещественный массив и отрицательные элементы надо отсортировать в порядке возрастания, а остальные элементы без изменения.
#include <stdio.h>
int main(int argc, char *argv[])
{
int n;
printf("Enter size of massive ");
scanf("%d", &n);
double arr[n];
for(int i = 0; i < n; i++){
printf("arr[%d] ", i);
scanf("%lf", &arr[i]);}
printf("\n prostoi massiv \n");
for(int i = 0; i < n; i++){
printf("%lf ", arr[i]);}
// представляем, что отрицательный элемент самый первый
for(int pos = 0; pos < n; pos++)
{
for(int x = pos +1; x < n; x++)
if(arr[pos] > arr[x] && arr[x] < 0 && arr[pos] < 0){
int min = arr[x];
arr[x] = arr[pos];
arr[pos] = min;
}
}
printf("\n sorted: \n");
for (int x = 0; x < n; x++) {
printf("%lf ", arr[x]);
}
return 0;
}Решение задачи: «Отрицательные элементы массива отсортировать в порядке возрастания»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
//сортировка выбором
void ssort(double a[], int n, int (*cmp)(double)){
double t;
int i, j, k;
for(i = 0; i < n; ++i){
if(!(*cmp)(a[i]))
continue;
k = i;
j = i + 1;
while((j < n) && !(*cmp)(a[j]))
++j;
for(; j < n; ++j){
if((*cmp)(a[j]) && (a[j] < a[k]))
k = j;
}
if(i != k){
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
static int compare(double n) { return (n < 0.0); }
int main(void){
int i;
double a[N];
srand((unsigned int)time(NULL));
for(i = 0; i < N; ++i)
a[i] = -9 + rand() % 19;
//вывеод исходного массива
for(i = 0; i < N; ++i)
printf("% 2lg ", a[i]);
putchar('\n');
ssort(a, N, compare);
//вывод отсортированного массива(только отрицательных элементов)
for(i = 0; i < N; ++i)
printf("% 2lg ", a[i]);
return 0;
}
Объяснение кода листинга программы
- #include
Включает в себя файл стандартного ввода/вывода, который содержит функции для работы с консолью. - #include
Включает в себя файл стандартной библиотеки, который содержит функции для работы с памятью и строками. - #include
Включает в себя файл стандартной библиотеки, который содержит функции для работы со временем. - #define N 10 Определяет константу N, которая равна 10.
- *void ssort(double a[], int n, int (cmp)(double))** Функция сортировки выбором, принимает на вход массив a, его размер n и функцию сравнения cmp.
- double t; Объявляет переменную t типа double, которая будет использоваться в функции для временного хранения значения.
- int i, j, k; Объявляет три переменные i, j, k типа int, которые будут использоваться в функции для цикла и обмена значениями.
- for(i = 0; i < n; ++i){ Начало цикла for, который проходит по всем элементам массива.
- *if(!(cmp)(a[i]))** Проверка, является ли текущий элемент отрицательным, если нет, то переход к следующему элементу.
- k = i; Присваивает значение переменной k, равное индексу текущего элемента.
- j = i + 1; Присваивает значение переменной j, равное индексу следующего элемента.
- *while((j < n) && !(cmp)(a[j]))** Начало цикла while, который проходит по всем элементам массива до тех пор, пока не найдет отрицательный элемент или не достигнет конца массива.
- for(; j < n; ++j){ Начало цикла for, который проходит по всем элементам массива с индексом больше k.
- *if((cmp)(a[j]) && (a[j] < a[k]))** Проверка, является ли текущий элемент меньше текущего отрицательного элемента и если да, то обновление значения k.
- t = a[i]; Присваивание значения переменной t, равного значению текущего элемента.
- a[i] = a[k]; Замена значения текущего элемента на значение k-го элемента.
- a[k] = t; Замена значения k-го элемента на значение t.
- } Конец функции ssort.
- static int compare(double n) { return (n < 0.0); } Функция сравнения, которая возвращает 1, если число отрицательное, и 0 в противном случае.
- int main(void){ Функция main, которая содержит основной код программы.
- int i; Объявление переменной i типа int для цикла.
- double a[N]; Объявление массива a типа double с размером N.
- srand((unsigned int)time(NULL)); Инициализация генератора случайных чисел текущим временем.
- for(i = 0; i < N; ++i) Начало цикла for, который заполняет массив a случайными числами.
- a[i] = -9 + rand() % 19; Генерация случайного числа от -9 до 0.
- printf(
% 2lg, a[i]); Вывод элемента массива с пробелом после него. - putchar('\n'); Перевод строки.
- ssort(a, N, compare); Вызов функции сортировки ssort с массивом a, его размером N и функцией сравнения compare.
- for(i = 0; i < N; ++i) Начало цикла for, который выводит отсортированный массив.
- printf(
% 2lg, a[i]); Вывод элемента массива с пробелом после него. - return 0; Конец функции main.