sort与stable_sort的使用。

sort底层结合了快速排序、堆排序和插入排序,其中快排属于交换排序。

交换排序主要有快排和冒泡,快排是不稳定的,相同元素可能会交换位置,而冒泡稳定。

#include <bits/stdc++.h>
#include <utility>
#include <vector>
using namespace std;

bool cmpFirstOnly(const pair<char,char> & a,const pair<char,char> & b){
    return a.first<b.first;
}

int main() {
    string s;
    getline(cin,s);
    int n=s.size();
    vector<pair<char,char>> vec;//first aa second aA
    for(int i=0;i<n;i++){
        if(isalpha(s[i])){
            vec.push_back({tolower(s[i]),s[i]});
        }
    }
//方法一:
    //sort(vec.begin(),vec.end(),cmpFirstOnly);//无法通过 快排是不稳定排序
    //用例:gjo%%CGP-A+@-krz~dhxWb$qVev+!W^)~--U+ysdA^ZA~y^SxF!PUu&k
    //错误位置:UuU 应为UUu
    //sort改为stable就可以了!!!stable_sort:相等就保持不变!
	stable_sort(vec.begin(),vec.end(),cmpFirstOnly);//可以通过
/*
//方法二://可以通过 冒泡是稳定排序
    int m=vec.size();
    for(int i=0;i<m;i++){
        for(int j=0;j+1<m-i;j++){
            if(vec[j].first>vec[j+1].first){
                pair c=vec[j];
                vec[j]=vec[j+1];
                vec[j+1]=c;
            }
        }
    }
*/
    int k=0;
    for(int i=0;i<n;i++){
        if(isalpha(s[i])){
            s[i]=vec[k++].second;
        }
        cout<<s[i];
    }
    return 0;
}