Сортировка сторон n треугольников по площади - PullRequest
0 голосов
/ 19 декабря 2018

Учитывая n треугольников, со сторонами a, b, c напечатайте их в том же стиле, сортируя их от самого маленького до самого большого.Полная задача: https://www.hackerrank.com/challenges/small-triangles-large-triangles/problem

В решении мы имеем структуру с именем Треугольник.Он имеет 3 целых числа a, b, c.Создается массив треугольников, называемый tr, и входные данные передаются в функцию sort_by_area.Мой подход заключается в применении пузырьковой сортировки к этому массиву. Но вместо того, чтобы сравнивать tr [j]> tr [j + 1], как мы это делаем при обычной пузырьковой сортировке, я сравниваю области tr [j] и tr [j +1].Теперь, если область tr [j]> tr [j + 1]: Swap.

Проблема: В конце концов результаты неверны.Массив не сортируется должным образом.Сначала я подумал, что это где-то опечатка, поэтому переписываю код, но проблема сохраняется.

double area (int a, int b, int c)
{
 double  p = (a+b+c)/2;
 return sqrt(p*(p-a)*(p-b)*(p-c));
}

void sort_by_area(triangle* tr, int n) {
/**
* Sort an array a of the length n
*/
int i,j;
double area1, area2;
triangle temp;
for(i = 0; i < n-1;++i)
{ 
    for(j = 0; j < n-i-1; ++j)
    {
        area1 = area(tr[j].a , tr[j].b, tr[j].c);
        area2 = area(tr[j+1].a , tr[j+1].b, tr[j+1].c);
        if(area1 > area2)
        {
            temp = tr[j];
            tr[j] = tr[j+1];
            tr[j+1] = temp;
        } 
    }
}

}

Ввод: 20

23 37 47 22 18 5 58 31 31 28 36 40 54 62 1131 41 14 53 18 54 41 38 55 55 44 44 44 48 18 26 41 65 20 23 21 58 61 50 28 56 56 20 39 32 33 45 49 26 41 62 31 46 39 48 49 67 57 33 45

ожидаемый результат: 22 18 5 31 41 14 20 23 21 54 62 11 26 41 65 58 31 31 20 39 32 26 41 62 44 48 18 23 37 47 53 18 54 28 36 40 31 46 39 33 45 49 57 33 45 2856 56 41 38 55 55 44 44 48 49 67 58 61 50

фактическая мощность: 22 18 5 54 62 11 31 41 14 20 23 21 26 41 65 20 39 32 58 31 31 26 41 62 23 37 4744 48 18 53 18 54 28 36 40 31 46 39 33 45 49 57 33 45 28 56 56 41 38 55 55 44 44 48 49 67 58 61 50

...