OVSolitario-io

导航

排序算法(cmp支持两类型相同元素之间的构造)

关于各种排序方式

image

对于STL实现的sort: int, double, string自定义排序顺序和结构体需要自定义cmp

其中sort(首元素地址, 尾元素后面一个的位置, 自定义比较函数);
因此sort默认从0~n-1排序

自定义cmp

bool cmp(相对靠前的元素,相对靠后的元素)
因此sort是两元素之间的比较,所以只要符合两类型元素之间的比较通过结构体来a和b的不同形式来得到想要的结果
image

计数/桶排序: 计数器记录数字出现次数依次遍历输出

选择排序: 依次固定当前位为最大/小值,若不是则swap

for(int i = 1; i <= n - 1; ++ i) 
    for(int j = 1 + 1; j <= n; ++ j ) 

结构体使用&排序
image

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);

多关键字排序: 核心是枚举相对顺序即可
image

排序的本质就是相对的顺序,所以即使多个限制条件,改变的也只是两个元素之间的(队伍中小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]) {
        }
    }
}

快速排序: 通过哨兵构造左边 < 哨兵 < 右边
image

image

posted on 2025-06-23 05:18  TBeauty  阅读(220)  评论(0)    收藏  举报