🔀 C3-9 随心所欲的排序

自定义比较函数cmp · 多条件排序 · 区间排序 · 奇偶分段

🔀 C3-9 · 自定义排序
从"只会从小到大"到"想怎么排就怎么排"的关键提升
⚖️

一、cmp比较函数

  • 格式:bool cmp(int zuo, int you)
  • 返回类型:bool(true/false)
  • true:zuo排在you前面,不交换
  • false:zuo不该在前,交换位置
  • 调用:sort(a, a+n, cmp)
⬇️

二、从大到小排序

  • 升序(默认):return zuo < you
  • 降序:return zuo > you
  • 只改一个符号!
  • 字符也能排:按ASCII码比较
  • char cmp(char a, char b)
🎭

三、奇偶分段排序

  • 奇数在前:return zuo%2 > you%2
  • 奇数%2=1,偶数%2=0
  • 偶数在前:return zuo%2 < you%2
  • 原理:1>0为true,奇数排前
  • 同组内部:再按大小排
📊

四、多条件排序

  • 先判第一关键字:if判断不同
  • 不同就return第一关键字结果
  • 相同再return第二关键字
  • 口诀:先主后次,先分后细
  • 类比:先按身高,再按体重
📍

五、区间排序

  • 部分排序:sort(a+l, a+r+1)
  • 只排[l, r]区间
  • 其他元素不动
  • 注意:结束位置是a+r+1
  • 左闭右开:[start, end)
🎯

六、核心要诀

  • cmp就是裁判
  • 问:左边该排前面吗?
  • 想清楚谁在前,再写return
  • 多条件:先if不同,再return
  • 函数名直接传给sort第三参

📝 核心代码模板速查

模板1:从大到小排序(降序)

#include <iostream> #include <algorithm> using namespace std; bool cmp(int zuo, int you) { return zuo > you; // 左边比右边大?大就排前面 } int main() { int a[5] = {2, 6, 3, 8, 1}; sort(a, a+5, cmp); // 输出:8 6 3 2 1 return 0; }

模板2:奇偶分段(奇数在前,同组从小到大)

bool cmp(int zuo, int you) { if (zuo % 2 != you % 2) { // 奇偶性不同 return zuo % 2 > you % 2; // 奇数(1)排前面 } return zuo < you; // 奇偶相同,按大小升序 } // 数组{5,1,4,1,2,3,7} → {1,1,3,5,7,2,4}

模板3:多条件排序(先按个位升序,个位相同按整体降序)

bool cmp(int zuo, int you) { if (zuo % 10 != you % 10) { // 个位不同 return zuo % 10 < you % 10; // 个位小的在前 } return zuo > you; // 个位相同,大的在前 }

🔍 C3-9 知识对照表

排序需求cmp写法效果
从小到大(默认)return zuo < you升序排列
从大到小return zuo > you降序排列
奇数在前偶数在后return zuo%2 > you%2奇偶分段
偶数在前奇数在后return zuo%2 < you%2奇偶反向分段
先奇后偶同组升序if(zuo%2!=you%2) return zuo%2>you%2; return zuo<you;分段+组内排序
按个位排序return zuo%10 < you%10个位小的在前
区间排序sort(a+l, a+r+1, cmp)只排[l,r]区间
字符降序return zuo > you(char类型)按ASCII码倒序

🗺️ C3-9 学习路线

📖 复习sort基础→ ⚖️ 认识cmp函数→ ⬇️ 从大到小排序→ 🎭 奇偶分段→ 📊 多条件排序→ 🏆 排序大师挑战赛

⚠️ C3-9 高频易错点

① cmp返回值方向:return true表示zuo排在you前面,return false才交换。方向搞反结果就反了!
② 降序只改一个符号:升序return zuo < you,降序return zuo > you。不要写成别的表达式。
③ 奇偶分段原理:zuo%2 > you%2中,奇数%2=1、偶数%2=0,1>0为true所以奇数排前面。别搞反!
④ 多条件排序先if后return:先判断第一关键字是否不同,不同就return第一关键字结果;相同才return第二关键字。
⑤ 区间排序右边界:sort左闭右开!sort(a+l, a+r+1)才是排[l,r]闭区间。写成a+r会漏掉最后一个。
⑥ cmp参数类型要对应:排int数组用int参数,排char数组用char参数,别用错类型。
⑦ sort头文件:使用sort必须#include <algorithm>,不写会编译报错!