在使用C语言比较函数qsort的时候需要自己编写比较函数,比如两个参数a和b,很多人对于return a - b就是升序,return b - a就是降序感到不理解,这篇文章可以快速解决一下这个问题。
qsort不感知你到底是升序还是降序,他完全根据参数的返回值来决定先后顺序,同样两个参数a和b:
- 返回值 < 0:表示
a应该排在b的前面 - 返回值 == 0:表示
a和b相等,他们的相对顺序不确定 - 返回值 > 0:表示
a应该排在b的后面
对于整数a和b,目标为升序排序(从小到大):
- 若
a > b,我们希望a排在b的后面,也就是希望返回值为正 - 若
a < b,我们希望a排在b的前面,也就是希望返回值为负
所以最直接的方法就是return (a - b),可以完美覆盖我们的希望,对着上面不等式,简单的把b移到不等式左边即可:
- 当
a < b-> 希望a排前 -> 希望返回负数 ->a - b < 0-> 正确! - 当
a > b-> 希望a排后 -> 希望返回正数 ->a - b > 0-> 正确!
但这样的做法没有考虑到整数溢出的问题。
例如,比较两个int类型的值:
a = INT_MAX(2147483647)b = -1a - b = 2147483647 - (-1) = 2147483648
这个结果超出了int型正数的最大值,会发生溢出,导致结果是未定义行为,很可能变成一个负数。这会导致排序结果完全错误。
|
|
|
|