现在有 n 条线段,线段的左端坐标为 L ,右端坐标为 R(保证 L<R)。需要对这些线段排
序,具体要求如下:
l
在左端坐标不一样的时候,按照左端坐标从小到大排序;
l
在左端坐标相等的时候,按照右端坐标从小到大排序。
输入要求:
输入共 n+1 行;
第一行为一个整数 n (1≤n≤1000),表示一共有 n 条需要排序的线段;
接下来 n 行,每行两个整数 L,R (0≤L,R≤100),表示每条线段的左端和右端坐标。
需要注意的是,可能会出现一模一样的线段,请将他们全部输出。
输出要求:
一共输出 n 行,为 n 条线段从小到大排序之后的结果;
每一行两个整数,为每条线段的左端和右端坐标,以一个空格分隔。
输入样例:
3
2 3
1 4
1 2
输出样例:
1 2
1 4
2 3
C语言.现在有 n 条线段,线段的左端坐标为 L ,右端坐标为 R(保证 L<R)。需要对这些线段排序,具体要求如下
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
下坠丷 2022-05-20 18:24关注#include<iostream> #include<algorithm> using namespace std; struct P { int left; int right; }; bool cmp(P& p1, P& p2) { if (p1.left == p2.left) { return p1.right < p2.right; } return p1.left < p2.left; } int main() { int n; cin >> n; P* arr = new P[n]; for (int i = 0; i < n; i++) { int a, b; cin >> a >> b; arr[i] = { a,b }; } //sort(arr, arr + n, cmp); //冒泡排序 bool adjust = true; //标识符,如果一次循环没有做交换则说明数据有序 for (int i = 0; i < n-1&&adjust; i++) { adjust = false; for (int j = i + 1; j < n; j++) { //arr[j-1]比arr[j]相比,cmp返回false时交换 if (!cmp(arr[j-1], arr[j])) { P temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; adjust = true; //做交换后更改标识 } } } for (int i = 0; i < n; i++) { cout << arr[i].left << ' ' << arr[i].right << endl; } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录