C语言算法题技巧汇总/大复习[未完结]

目录

    • 最简单的桶排序
    • 最简单的去重
    • 最简单的队列
    • template模版
    • 双端队列
    • vector or list
    • 队列结构存在于两种算法
      • 广度优先搜索
      • 贝尔曼福特算法(Bellman-Ford)

最简单的桶排序

利用数组序号的自顺序进行排序输入输出

int book[1001],i,j,t,n;//size=num-1
for(i=0;i<=1000;i++)
	book[i]=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
	scanf("%d",&t);
	book[t]++;
}
for(i=1000;i>=0;i--)
	for(j=1;j<book[i];j++)//book[i]里有几就打印几次
		printf("%d",i);

最简单的去重

//假设经过排序之后
for(i=2;i<=n;i++)
	if(a[i]!=a[i-1])
		printf("%d",a[i]);

最简单的队列

利用数组,再加上设置两个指针head,tail构成其基本元素。
出队:head++;
入队:q[tail]=x;tail++;

//封装好的简易queue
struct queue
{
	int data[100];
	int head;
	int tail;
}
struct queue q;
void init_q(queue &q){
	q.head=1;
	q.tail=1;
}
int isfull_q(queue &q){
	if(q.tail>=99)
		return 1;
	else return 0;
}
int isempty_q(queue &q){
	if(q.head<=1)
		return 1;
	else return 0;
}
int insert_q(queue &q,int num)
{
	if(isfull_q(q)!=1)
	{	q.data[q.tail]=num;
		q.tail++;
	}
}
int qout_q(queue &q,int &n)
{
	if(isempty_q(q)!=1)
	{
		n=q.data[q.head];
		q.head++;
	}
}

/*c++ stl库中的queue实现
C++ STL中给出的stack和queue类的声明为:
由stack和queue的声明不难发现,它们本质上并不是容器,而是容器适配器,stack和queue的底层都是调用名为deque(双端队列)的容器的接口来实现的。
所谓适配器,通俗讲就是一种设计模式,即:一套被反复使用的、为多数人所知晓的、经过分类编目的代码设计经验的总结,设计模式可以将一个类接口转换为用户希望的其它类接口。

template >  class stack;
template >  class queue;

template模版

在没有泛型编程时,只能使用函数重载逐个写,每次都要摘过来一段代码。
重载的函数仅仅是参数列表中的类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数代码的可维护性比较低,一个出错可能所有的重载均出错。
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础模板,分为函数模板和类模板。函数模板只是一个蓝图,在实例化时,根据推导的参数的类型来生成特定的版本。
templatetypename是用来定义模板参数的关键字,也可以使用class(切记:不能使用struct代替class)

双端队列

deque是双端队列容器,它可以同时支持O(1)时间复杂度下的头部的插入删除和在尾部的插入和删除,同时,可以通过下标来访问任意位置处的元素。

对于vector,它可以支持O(1)时间复杂度下的尾插数据和尾删数据,但要实现头插和头删则需要O(N)的时间复杂度。
对于list,它可以实现在O(1)时间复杂度下任意位置的插入和删除数据,但不能支持通过下标来进行随机访问。
所以,在某种程度上,我们可以认为deque兼具了vector和list的一些优点。

vector or list

队列结构存在于两种算法

广度优先搜索

贝尔曼福特算法(Bellman-Ford)

你可能感兴趣的:(c语言,算法,开发语言)