排序算法(cmp支持两类型相同元素之间的构造)
关于各种排序方式

对于STL实现的sort: int, double, string自定义排序顺序和结构体需要自定义cmp
其中sort(首元素地址, 尾元素后面一个的位置, 自定义比较函数);
因此sort默认从0~n-1排序
自定义cmp
bool cmp(相对靠前的元素,相对靠后的元素)
因此sort是两元素之间的比较,所以只要符合两类型元素之间的比较通过结构体来a和b的不同形式来得到想要的结果

计数/桶排序: 计数器记录数字出现次数依次遍历输出
选择排序: 依次固定当前位为最大/小值,若不是则swap
for(int i = 1; i <= n - 1; ++ i)
for(int j = 1 + 1; j <= n; ++ j )
结构体使用&排序

struct kid
{
bool check;
double s;
}a[2005];
//kid q[N];//第二种
bool cmp(kid x,kid y)//结构体自定义cmp排序
{
return x.s < y.s;
}
sort(a + 1,a + n + 1, cmp);
多关键字排序: 核心是枚举相对顺序即可

排序的本质就是相对的顺序,所以即使多个限制条件,改变的也只是两个元素之间的(队伍中小x和小y之间)相对顺序
插入排序: 把当前位制造空位,最后通过移动插入合适位置
for(int i = 1; i <= n; ++ i) {
int now = a[i], j;//制造空位,通过若前面比我大则将其向后移位
//最后放入合适位置
for(int j = i - 1; j >= 1; -- j) {
if(a[j] > now) {//也可以理解我比你小你后移
a[j + 1] = a[j];
}
else break;//第j位比我小,我放在他后面(后面是空位)
}
a[j + 1] = now;//放入
}
冒泡排序: 会存储当前最大/小值,以确保最高位确定
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {//每次处理1位放最后
if (a[j] > a[j + 1]) {//我比我后面大则交换
swap(a[j], a[j + 1]);
}
}
}
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j < n; ++ j) {
if(c[j] > c[j + 1]) {
}
}
}
快速排序: 通过哨兵构造左边 < 哨兵 < 右边


浙公网安备 33010602011771号