c语言关于快速排序

类似于excel表的排序。分主序和次序,主序相同的按次序排。struct Data { int a; int b;};定义"da \u0026lt; db": if (da.a \u0026lt;db.a || (da.a == db.a \u0026amp;\u0026amp; da.b \u0026lt; db.b)) //进行da \u0026lt; db相关操作
■网友
比如... (0, 5) (1, 4), (2, 3), (3, 2), (4, 1), (5, 0) 同时满足升序?
■网友
额。。好像C没有重载运算符哦。。记错了。。那就改一下好了用结构体表示二维数组呗#include \u0026lt;stdio.h\u0026gt;#include \u0026lt;stdlib.h\u0026gt;typedef struct point2d { int x, y; }point2d; int cmp(const void* lhs, const void* rhs) { point2d arg1 = *(const point2d*)lhs; point2d arg2 = *(const point2d*)rhs; if (arg1.x \u0026lt; arg2.x || arg1.x == arg2.x \u0026amp;\u0026amp; arg1.y \u0026lt; arg2.y) return -1; if (arg2.x \u0026lt; arg1.x || arg2.x == arg1.x \u0026amp;\u0026amp; arg2.y \u0026lt; arg1.y) return 1; return 0;} int main(){ point2d arr; for (int i = 0; i \u0026lt; 3; ++i) scanf("%d%d", \u0026amp;arr.x, \u0026amp;arr.y); qsort(arr, 3, sizeof(arr), cmp); for (int i = 0; i \u0026lt; 3; ++i) printf("(%d,%d)\", arr.x, arr.y);}input:1 52 31 2output:(1,2)(1,5)(2,3).
■网友
看你选哪个为主要素,哪个为次要素。先对主要素排序,主要素相同的再用次要素排序
■网友
如果你想要实现简单的话,可以先对第二个坐标进行排序,然后再对第一个坐标进行排序。当然,这样的时间复杂度要更大一些。或者你可以直接用比较的时候这么写(爪机打字的,见谅)假设用的是struct point { int x; int y;}伪代码:if(p.x\u0026gt;p.x) //交换else if(p.x==p.x \u0026amp;\u0026amp; p.y\u0026gt;p.y) //交换如果你会qsort的话,也是类似的比较。
■网友
题主,你如果明白几种排序方法的原理就能得出所有的排序本质是两两比较,然后交换位置的结论。不同的排序方法区别在于两个比较数的选择。快排是从两端向中间靠拢选择比较数,关键数是你任意选的。然后一轮比较排序完毕之后关键数将整个数组分为两段新数组,一段全部不小于关键数,另一段不大于关键数。递归比较排序新的数组可以得到排序完成的数组。以上是快排的排序思想,不涉及到排序完成后是升序还是降序。这是因为升序和降序取决于交换动作执行语句前的判断条件。(这一句是重点)你再看一下自己写的代码,看看那句判断条件,把它修改成降序(升序)。接着再看你提出的问题。本质上是主要因素和次要因素的问题。那么判断条件只需要修改为先比较第一个数,如果第一个数相等再判断第二个数。总结就是这个排序和排序方法是没有关系的,区别都在于判断条件。所以调用库函数时需要你自己写一个比较函数。
■网友
写一个struct然后写camp函数(用来比较两个struct的大小)然后用stdlib里面的qsort函数更新一下:std::sort函数的第三个参数就是外接一个比较函数,返回bool值的,用于比较大小或者使用基数排序,先对第二个数排再对第一个数排
■网友
没太看懂题主的意思


    推荐阅读