本周,通过对STL 的初步学习,我又掌握了一些知识,再通过昨天对相关资料的阅读,我觉得有必要对一些知识进行一下总结汇总,以方便自己整理思路及日后运用。
目录
排序
1.冒泡排序与选择排序
这两种排序是在上学期学习的最基础的排序,虽然模板上教给我们的是一个升序一个是降序,但其实只要正确理解两种排序的实质,只要自己确定大于小于的使用,就可以自主确定升降序了。
其中冒泡排序的思路更简单,将数列中前后两个数依次比较并交换,通过不断减小比较次数的大小,最后得到有序的数列。
for(int i=0;i<n-1;i++)//n为数列的大小
{
for(int j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
int temp =a[j];
a[j]=a[j+1];
a[j+1]=temp;
}}}
选择排序则比较直接,直接选出最小/大的那一位,将其与第i位进行交换,最后得到有序数列
for (int i = 0; i < n - 2; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[i] < a[j])
{
int temp = a[j];
a[j] = a[i];
a[i] = a[j];
}
}
}
这两种排序最为简单实用,但在比赛时较为繁冗,易导致超时。
2.快速排序
这是在寒假时自学的一种排序方式,但由于没有系统的学习,导致掌握程度不深,只是简单的明白了原理,为防止之后复习误导,就不做赘述,之后专门写一篇关于快速排序的博客做记录吧。
3.sort函数排序
这是上周新学的一种排序,是运用函数进行排序的方法。虽然不知道函数体的具体代码,但至少会用,就简单说一下。
据我了解,sort()函数是类似于快速排序的方法,时间复杂度为n*log2(n),执行效率较高,但在使用时要记得加头文件#include<algorithm> 一般而言,sort进行的是升序排列,即
如果想进行降序排列,则需增加新的参数,cmp函数。cmp函数其实就是一个确认前后量大小的布尔类型函数。但在sort函数里,则可以更改排序规则。不过,使用时要打出cmp函数的函数体。
sort 函数在使用时十分方便,而且速度快,代码清晰,在今后的使用中可以重点注意
动态数组
1.常变量动态数组
这是我当初自己摸索出的一种自定义长度的“动态”数组。实质上就是运用常变量,自由输入数组长度,以方便运用。虽然不能说有多动态,但使用起来很方便。不过,他也具有一定的局限性,在VS等对语法要求严格的编译器上无法使用,只能在codeblock 上使用,不过,我当初在比赛时用过一次,似乎是可以用的。
const int a;
cin >> a;
int b[a];
2.new 定义动态数组
这是最近学习面向对象后新学习的一种动态数组,核心在于对new 的使用,不过,这种数组需要直接用指针指向,不能命名,使用起来比较麻烦,不过它可以自行增长数组的长度,比如,之前有5个长度,当填满这5个需要再度填入时,就可以自动再加5个,对一些情况很方便。
语法:指针名 = new 数据类型 [数组长度]
int n , *p;
cin >> n;
p = new int [n];
p[0]=1;
3.vector动态数组
这是本周最新学的一个动态数组,很简练。有点像类的使用。
定义:vector <数据类型> 数组名;
注意:加头文件#include <vector>
误区:不能用 for(int i=0;i<n;i++){ a[ i ] = i ; }类似的方法赋值,只能用push_back()赋值
虽然对于这个动态数组我还没使用过,但我能明白这个知识的重要性,在今后的习题中勤加练习。
结语:
关于排序,我一直好奇优先队列是否能算其中一个,它也是根据使用者的意愿进行大小排列,不过它似乎不能直接作为排序手段,就没有加入。今天总结的知识点都很重要,这不仅仅是简单的总结,更是对自己思路的一种整理,今后更多的知识,也需要保持这样的态度。