你的位置:kaiyun.com-开云官网登录入口(中国)官方网站 > 新闻中心 > 开云体育这里不错先径直用STL的sort()函数-kaiyun.com-开云官网登录入口(中国)官方网站

开云体育这里不错先径直用STL的sort()函数-kaiyun.com-开云官网登录入口(中国)官方网站

时间:2026-01-29 19:11 点击:122 次

开云体育这里不错先径直用STL的sort()函数-kaiyun.com-开云官网登录入口(中国)官方网站

#itup01媒介开云体育

这个专栏我齐是参考册本《算法竞赛初学到进阶》,罗勇军、郭卫斌老诚著进行编写的。

通过册本上的材料以及我方的意会来撰写博客。

有不顺应的方位,接待列位一又友指正!

也相等接待列位hxd一谈学习探讨。

一、诡计资源

法子初始时需要两种资源,即诡计技能和存储空间。资源是有限的,一个算法对这两个资源的使用进程不错用来臆度该算法的优劣。

技能复杂度:法子初始需要的技能

空间复杂度:法子初始需要的存储空间

经常用O来示意复杂度

通过底下这个例子来论述复杂度的意见和影响

源码:

#include<iostream>

using namespace std;

int main() {

int i, k=0, n = 1e8;

clock_t start, end;

start = clock();

for (int i = 0; i < n; i++) {

k++;

}

end = clock();

cout << (double)(end - start) / CLOCKS_PER_SEC << endl;

}

1

2

3

4

5

6

7

8

9

10

11

12

分析:

初始恶果:

是以不错看出,在n=1e8的时候,输出技能为0.135.

当n=1e9的时候

输出技能为:1.313

那么咱们如何来评定他的技能复杂度呢?

由于不同的诡计机性能不同,是以不成径直把上头的技能当作技能复杂度。应该字据法子实行的次数来臆度才合理。

是以上头的法子实行了n次,那么技能复杂度即是O(n)。

例题分析

给出n个整数,按照从大到小的律例输出其中前m大的数

输入样例:

5 3

3 -35 92 213 -644

输出样例:

213 92 3

1

2

3

4

5

6

7

底下用冒泡排序,快速排序,哈希3种算法进行编程

冒泡排序

#include<iostream>

using namespace std;

int a[10000001];//纪录数字

int m, n;

void bubble_sort() {//冒泡排序,恶果仍然放到数组a中

int temp;

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

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

if (a[j] < a[j+1]) {

temp = a[j];

a[j] = a[j + 1];

a[j + 1] = temp;

}

}

}

}

int main() {

while (scanf_s("%d %d", &n, &m)!=EOF) {

for (int i = 0; i <= n-2; i++) {

scanf_s("%d ", &a[i]);

}

printf_s("OK\n");

bubble_sort();

for (int i = 0; i < m; i++) {

printf_s("%d ", a[i]);

}

printf("\n");

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

初始恶果

技能复杂度为O(n^2)

快速排序

快速排序是基于分治法的优秀排序算法。这里不错先径直用STL的sort()函数。它是立异的快速排序,称为“自省式排序”将上头的冒泡算法改为

sort(a,a+n);即可

哈希算法

哈希算法是一种以空间换技能的算法。本题的哈希想路是:在输入数字t的时候,在a[5000000+t]这个位置纪录a[50000000+t]=1,在输出的时候一一查验a[i],若是a[i]等于1,就示意这个数存在,打印前m个数

#include<iostream>

using namespace std;

const int MAX = 1000001;

int a[MAX];

int main() {

int n, m;

while (scanf_s("%d %d", &n, &m) != EOF) {

memset(a, 0, sizeof(a));//将数组a清0

for (int i = 0; i < n; i++) {

int t; \

scanf_s("%d", &t);

a[500000 + t] = 1;//数字t,登记在500000+t这个位置

}

for (int i = MAX-1; m > 0; i--) {

if (a[i]) {

printf_s("%d ", i-500000);

m--;

}

}

printf_s("\n");

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

初始恶果:

技能复杂度为O(n)

算法的接收

关于兼并个问题老是有不同的管束主见,是以咱们在践诺缔造中对算法的接收要从践诺情况和空间,技能复杂度来考虑。

二、算法的界说

折服大家齐知谈**“法子=算法+数据结构”**,算法是管束问题的逻辑、方法、经过,数据结构是数据在诡计机中的存储和探询形式,二者考究投合。

算法是对特定问题求解要领的一种描述,是领导的有限序列。它有底下5个特征

输入:一个算法有0个或多个输入。法子不错莫得输入,举例一个定时闹钟法子,他不需要输入,关联词梗概每隔一段技能就输出一个警报。

输出:一个算法有一个或多个输出。法子不错莫得输入关联词一定要有输出。

有穷性:一个算法必须在实行有穷步之后松手,且每一步齐在有穷技能内完成。

细目性:算法中的每一条领导必须有果然的含义,关于交流的输入只可获取交流的输出。

可行性:算法描述的操作不错通过仍是收场的基本操作实行有限次来收场。

算法的评估

臆度算法性能的主要法子是技能复杂度。

为什么不商议空间复杂度呢?

在一般情况下,一个法子的空间复杂度是容易分析的,而技能复杂度时常经营到算法的根柢逻辑,更能评释一个法子的优劣。

一个法子或算法的技能复杂度有以下几种可能

O(1)

诡计技能是一个常数,和问题的畛域n无关。举例用公式诡计时,一次诡计的复杂度即是O(1);哈希算法,用hash函数在常数技能内诡计出存储位置;在矩阵A[M] [N]中查找第i行第j列的元素只需要探询A[i][j]就够了。

O(log2n)

诡计技能是对数,经常是以2为底的对数,每一步诡计后,问题的畛域减小一倍。举例在一个长度为n的有序数列中查找某个数,用折半查找的方法只需要log2n次就能找到。再如分治法,一般情况下,在每一个要领把畛域减小一倍,是以一共有O(log2n)个要领。

O(n)

诡计技能随畛域n线性增长。在很厚情况下,这是算法可能达到的最优复杂度,因为对输入n个数,法子一般需要处理悉数的数,即诡计n次。举例查找一个无序数列中的某个数,可能需要查验悉数的数。再如图问题,有V个点和E个边,大渊博图的问题齐需要搜索到悉数的点和边,复杂度的上限即是O(V+E)

O(nlog2n)

这时常是算法等达到的最优复杂度。举例分治法,一共O(log2n)个要领,每一个要领对每个数操作一次,是以复杂度是O(nlog2n)。用分治法想想收场的快速排序和归比肩序算法复杂度即是O(nlog2n)

O(n^2)

一个两重轮回的算法,复杂度即是O(n^2)。举例冒泡排序即是典型的两重轮回。近似的复杂度还有O(n ^3),O(n ^4)等

O(2^n)

一般对应纠合问题,举例一个纠合中有n个数,条件输出它的悉数子集,子集有2 ^n个

O(n!)

在摆设问题中,若是条件输出悉数的全摆设,那么复杂度即是O(n!)。

上头的算法分为两类:

多项式复杂度:前5种

指数复杂度:后头2种

若是一个算法是多项式算法,就称它为“高效算法”;若是一个算法是指数复杂度,则称它为"初级算法"。多项式复杂度的算法跟着畛域的加多不错通过堆叠硬件来收场。关联词指数型的莫得主见。

问题畛域和可用算法表(铭刻)

❤(itup01)开云体育

地址:新闻中心科技园7022号

网站:www.muitwatch.com

Powered by kaiyun.com-开云官网登录入口(中国)官方网站 RSS地图 HTML地图


kaiyun.com-开云官网登录入口(中国)官方网站-开云体育这里不错先径直用STL的sort()函数-kaiyun.com-开云官网登录入口(中国)官方网站