|
这是题目的内容: 我个人是这样想的: |
|
| 10分 |
使用qsort():
#include <search.h>
typedef struct point
{
int s;
int x;
int y;
}Point;
Point *ps;
int i, n;
int cmp(Point *p1, Point *p2)
{
if (p1->x < p2->x) return 0;
else if (p1->x > p2->x) return 1;
else return p1->y > p2->y;
}
int main()
{
scanf("%d", &n);
ps = malloc(sizeof(Point)*n);
i = 0;
//读入坐标
while (i < n)
{
scanf("%d%d%d", &ps[i].s, &ps[i].x, &ps[i].y);
i++;
}
qsort(ps, n, sizeof(Point), cmp);
for (i = 0; i < n; i++) printf("%d ", ps[i].s);
printf("\n");
free(ps);
return 0;
}
|
| 5分 |
我的思路是用内存换时间
其实X坐标的个数最多也就20W,那就弄个大小是20W的数组,每个数组的索引是X,每个数组的元素是一个链表,链表按照Y来排序 当然,这种算法如果遇到所有X相同,只有Y不同的时候,那效率就灰常低了 空间时间折中的排序算法是桶排序,原理类似,但是内存用的少一些,楼主可以搜索一下,看看会不会有启发 |
| 5分 |
感觉这个数据是<10W的 用快排可能好点把?
|
|
好的,我试试 |
|
|
你好,这是我自己写的代码,但提交后是Time Limit Exceeded ,麻烦指点一下其中可以优化的地方,谢谢 #include<stdio.h> int main() struct zuobiao *p; scanf(“%d”,&n); p=(struct zuobiao*)malloc((n+1)*sizeof(struct zuobiao)); for(i=1;i<=n;i++) for(i=1;i<n;i++) for(i=1;i<=n;i++) printf(“\n”); |
|
| 5分 |
关于排序,还是数据结构里面的几种算法比较成熟,这里可以使用哈希排序算法,n lg(n),的时间复杂度,用两个嵌套就行了
|
| 5分 |
楼主你用的是冒泡排序吧,这个有什么说的,肯定超时,最慢的算法
|
| 5分 |
<1000个元素,冒泡排序
<100000个元素,qsort函数 <10000000个元素,放数据库中,建索引,(B+树排序) ≥10000000个元素,没用到过。 |
| 5分 |
两种方案:
1:先输入所有数据,然后用快排排序,快排平均时间复杂度是O(nlogn),但最坏情况时间复杂度为O(n^2),不过快排函数C语言的标准库已经帮你实现了:qsort,直接用就可以了。 2:用红黑树保存数据,在输入数据的时候就直接进行了排序,红黑树插入操作最坏情况时间复杂度为O(log(n)),所以输入+排序总的时间复杂度为O(nlogn),但红黑树你要自己实现。 |
|
谢谢指点 |
|
|
谢谢各位的指点,学到了不少新知识
|
|

