MSUStudentWork/WorkingArrays/9Ex/grouping.c

58 lines
2.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "grouping.h"
void group(double * array, int length) {
negativeToRight(array, length);
zeroesToCenter(array, length);
}
void negativeToRight(double * array, int length) {
double temp;
int negative = 0, last_index = length - 1;
for (int i = 0; i <= last_index - negative; ++i) {
// Так как мы передвигаем каждый отрицательный эл-нт в конец
// То тогда нам не нужно проверять последний эл-нт (т.к. он отрицательный) - поэтому я его пропускаю - -negative
if (array[i] < 0) {
for (int j = length - 2; j >= i; --j) {
// Сначала последний эл-нт копируется в предпоследний, а предпоследний в последний
// Далее каждый следующий j-й элемент заменяется тем, что находится на месте последнего, а последний элемент заменяется на j
// Так шаг за шагов элементы переставляются и наш i-й элемент оказывается на месте последнего (типа ЭП2)
temp = array[j];
array[j] = array[last_index];
array[last_index] = temp;
}
--i, ++negative;
}
}
}
void zeroesToCenter(double * array, int length) {
// Аналогичный способ перемещения эл-тов, но только не в конец, а в место между отрицательными и положительными числами
double temp;
int zeroes = 0, last_index = 0;
while (array[last_index] >= 0 && last_index < length) ++last_index;
// last_index < length - очень важен, так как если нет отрицательных чисел, то цикл уёдет в бесконечность
--last_index; // Так как изначально указывает на первый отрицательный элемент, а нам нужен последний положительный
for (int i = 0; i <= last_index - zeroes; ++i) {
if (fabs(array[i]) < eps) {
for (int j = last_index - 1; j >= i; --j) {
temp = array[j];
array[j] = array[last_index];
array[last_index] = temp;
}
--i, ++zeroes;
}
}
}
void printArray(double * array, int length) {
for (int i = 0; i < length; ++i) {
printf("%.2lf ", array[i]);
}
printf("\n");
}