【发布时间】:2018-12-19 17:41:02
【问题描述】:
给定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] 的面积:交换。
问题:最终结果是错误的。数组没有正确排序。一开始我以为是某个地方打错了,所以我重写了代码,但问题仍然存在。
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 11 31 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 28 56 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 47 44 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
【问题讨论】:
-
您的索引在内部循环中是错误的。对于冒泡排序,您要针对
i + 1和n - 1之间的每个元素检查元素i,但这里您要检查0 和n - i - 1之间的每个元素。更改内部循环范围或将i添加到第二项的数组索引中。 -
还要注意
(a+b+c)/2是整数除法,如果a+b+c是奇数,则会计算不正确的区域;除以2.0以确保浮点除法。 -
不要计算面积(你不关心面积是多少,你只关心面积会变大还是变小)。请注意,对于正数,如果
sqrt(a) < sqrt(b)为真,那么a < b也将为真(换句话说,您可以计算“面积平方”并改用它)。 -
@TypeIA 谢谢,但我还是不明白。我应该写 (j=i+1;j
-
@TypeIA 我实际上查了几个网站,他们都以类似的方式编写冒泡排序。以下是供参考的链接:www.geeksforgeeks.org/bubble-sort/ 和 www.programmingsimplified.com/c/source-code/c-program-bubble-sort 我不明白我的实现有什么问题,而且真的会如果您能举个例子,将不胜感激。谢谢。
标签: c bubble-sort