您的位置:首页 > 汽车 > 时评 > 如何建立一个网站app_免费申请公司网站_百度百家号怎么赚钱_正版google下载

如何建立一个网站app_免费申请公司网站_百度百家号怎么赚钱_正版google下载

2024/11/16 9:45:13 来源:https://blog.csdn.net/weixin_42944928/article/details/142866015  浏览:    关键词:如何建立一个网站app_免费申请公司网站_百度百家号怎么赚钱_正版google下载
如何建立一个网站app_免费申请公司网站_百度百家号怎么赚钱_正版google下载

稳定排序

        待排序的记录序列中可能存在两个或两个以上关键字相等的记录。排序前的序列中Ri领先于Rj(即i<j).若在排序后的序列中Ri仍然领先于Rj,则称所用的方法是稳定的。比如int数组[1,1,1,6,4]中a[0],a[1],a[2]的值相等,在排序时不改变其序列,则称所用的方法是稳定的。

例子:

int main() {vector<string> v1 = { "double","int","for","float","if", };vector<string> v2 = { "double","int","for","float","if", };//sort(v1.begin(), v1.end());stable_sort(v1.begin(), v1.end(), [](const string& s1, const string& s2)->bool {return s1.size() < s2.size();});//alg.sort(v2.begin(), v2.end());alg.stable_sort(v2.begin(), v2.end(), [](const string& s1, const string& s2)->bool {return s1.size() < s2.size();});_pn(v1);_pn(v2);return 0;
}

 输出:

实现代码:

/// <summary>
/// 稳定排序:
///		在排序时不改变其序列
///		待排序的记录序列中可能存在两个或两个以上关键字相等的记录。
///		排序前的序列中Ri领先于Rj(即i<j).若在排序后的序列中Ri仍然领先于Rj,
///		则称所用的方法是稳定的。比如int数组 [1, 1, 1, 6, 4] 中 a[0], a[1], a[2]的
///		值相等,在排序时不改变其序列,则称所用的方法是稳定的。
/// 
/// stable_sort 是 C++ 标准库中的一个算法,用于对指定范围内的元素进行排序。
/// 与 std::sort 不同,stable_sort 保证了相等元素的相对顺序不变,即稳定排序。
/// </summary>
/// <typeparam name="IteratorClass"></typeparam>
/// <typeparam name="ComparingFunctions"></typeparam>
/// <param name="itBegin"></param>
/// <param name="itEnd"></param>
/// <param name="f"></param>
/// 创建时间: 2024-10-11     最后一修改时间:2024-10-11(已测试)
template<typename IteratorClass, typename ComparingFunctions>
void stable_sort(IteratorClass itBegin, IteratorClass itEnd, ComparingFunctions f) {IteratorClass itSwap = itBegin;while (itBegin != itEnd) {auto itMin = Min(itBegin, itEnd, f);//判断下一个元素是否与itBegin相等,如果相等,则itBegin指向下一个元素auto itSwap = itBegin + 1;while (itBegin != itEnd && itBegin != itMin) {				//itBegin和itswap相等if ( f(*itBegin, *itSwap) == false && f(*itSwap, *itBegin) == false){				itSwap++;		}else {//abc1,abc2,abc3 c a  (先保存a元素,然后 [abc1,abc3,abc3,c] 后移一位//a,abc1 abc2,abc3,c auto tValue = *itMin;  //保存数据m.MoveBackIter(itBegin, itMin, 1);*itBegin = tValue;//itBegin = itSwap;	错误,不能用这句,还是在itBegin之前插入	//std::cout << "*itBegin=" << (*itBegin) << "\n";//std::cout << "*itBegin=" << (*(itBegin+1)) << "\n";break;}	 }			itBegin++;}
}

多规则排序

int main() {vector<string> v = {"for","a1","a2","a3","a5","a6","a4","int","a0","duble"};//先按长度排序,再按 string 对象内置 < 运算符排序alg.sort_two_rules(v.begin(), v.end(), [](const string& s1, const string& s2)->bool {return s1.size() < s2.size();});_pn(v);}

输出结果

实现代码:

/// <summary>
/// 
/// </summary>
/// <typeparam name="IteratorClass"></typeparam>
/// <typeparam name="ComparingFunctions"></typeparam>
/// <param name="itBegin"></param>
/// <param name="itEnd"></param>
/// <param name="f"></param>
/// 创建时间: 2024-10-12     最后一修改时间:2024-10-12(已测试)
template<typename IteratorClass, typename ComparingFunctions>
void sort_two_rules(IteratorClass itBegin, IteratorClass itEnd, ComparingFunctions f) {while (itBegin != itEnd) {Swap(itBegin, min_two_rules(itBegin, itEnd, f)); //与std::sort相同,从小到大itBegin++;}
}/// <summary>
/// 按两种规则查找最小值:
/// 先按规则 f 比较,如果f没有比较成功(实际上两个对象按f
/// 规则比较是等于),则按对象本身自带的运算符 < 来比较。
/// 例子: 
/// 
///		vector<string> v = { "abc6","abc1","abc3","abc2" };
///
///		auto s1 = alg.Min(v.begin(), v.end(), [](const string& s1, const string& s2)->bool {
///			return s1.size() < s2.size();
///		});
///
///
///		_pn(*s1);
///		auto s2 = alg.min_two_rules(v.begin(), v.end(), [](const string& s1, const string& s2)->bool {
///			return s1.size() < s2.size();
///		});
///
///		_pn(*s2);
/// 
/// 输出:
///		s1 = abc6
///		s2 = "abc1"
/// </summary>
/// <typeparam name="IteratorClass"></typeparam>
/// <typeparam name="ComparingFunctions"></typeparam>
/// <param name="itBegin"></param>
/// <param name="itEnd"></param>
/// <param name="f"></param>
/// <returns></returns>
/// 创建时间: 2024-10-11     最后一修改时间:2024-10-11
template<typename IteratorClass, typename ComparingFunctions>
IteratorClass min_two_rules(IteratorClass itBegin, IteratorClass itEnd, ComparingFunctions f) {assert(itBegin != itEnd);IteratorClass result = itBegin;itBegin++;while (itBegin != itEnd) {if (f(*itBegin, *result))  //  小于   if *itbegin < *resultresult = itBegin;else if (f(*result, *itBegin)) {  //大小//什么都不做}else { //即不是大于,又不是小于,再按对象运算符规则if(*itBegin < *result)result = itBegin;}++itBegin;}return result;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com