《算法笔记》4.1-总结

本节内容为排序

题目列表

  1. B1015/A1062
  2. A1012
  3. A1016
  4. A1028
  5. A1055
  6. A1075
  7. A1083
  8. A1080
  9. A1095

本节首先介绍了头文件<algorithm>下的排序函数sort();,sort()函数采用快排实现,并且进行了特殊处理保证能够规避掉经典快排中可能会实际上退化到O(N2)的情况,sort()函数的结构如下

sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填))

我们可以通过对比较函数cmp的改写,来制定不同的排序规则,适应不同情况下的排序要求。比如对一个复杂的结构体进行排序,我们可以指定这个结构体中不同元素在排序中的优先级,对整个结构体进行不同条件下的排序,cmp函数的格式如下

bool cmp(elemtype a,elmetype)

如果不写cmp函数,sort()将进行升序排列

当某些题目需要对数据对象进行排名时,例如按照成绩对学生进行排名,通常会要求成绩相同的排名相同,我们通常用以下这种方式来赋予排名(前提是所以对象已经按照排序规则严格就序)

    stu[0].rank=1;
	for(int i=1;i<count;i++)
	{
		stu[i].rank=i+1;
		if(stu[i].score==stu[i-1].score)
			stu[i].rank=stu[i-1].rank;
	}

将全体数据中的第一个置为第一名,此后循环从第二个对象开始,依次赋予排名,如果这个学生成绩和上一个相同,那么他的排名也要和上一个相同。

这类题目最重要的是设置合理的结构体,高效的存储信息并且能够对题目发挥良好的作用,然后对数据对象按照给定规则进行排序,之后进行数据的处理,同时我们要注意对于数据有一些预处理的方法,比如A1055中的预处理可以极大的减少正式处理的数据规模,提高算法的效率,避免超时。

结构体对象的初始化也是一个值得思考的点,如果你对结构体中某些元素初始化的时候赋予合适的值,会很好的在后面的算法中帮助到你,比如A1075中我们把stu中的grade全部初始化为-1,和0区别开来,对比编译通过得0分和未编译通过的情况

本章的算法难在怎么合理的处理数据,寻找解题要求的点,如何输出题目所要求的结果

猜你喜欢

转载自blog.csdn.net/qq_33657357/article/details/81411287