一、排序

1.桶排序

int main()
{
	int a[11],i,j,t;
    //初始化数组
	for(i=0;i<=10;i++)
	{
		a[i]=0;
	}
    //读入五个数用于排序
	for(i=1;i<=5;i++)
	{
		scanf("%d",&t);
		a[t]++;//a[t]记录分数t的出现次数
	}
	for(i=0;i<=10;i++)//依次判断a[0]-a[10]
	{
		for(j=1;j<=a[i];j++)//分数i出现的次数a[i]
		{
			printf("%d",i);//打印分数i
		}
	}
	return 0;
	
}

时间复杂度O(M+N)

2.冒泡排序

核心在于双层嵌套循环
分数排序:

int i,j,t,n;
int a[100];
printf("输入需要排序的个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
    scanf("%d",&a[i]);
}

for(i=1; i<=n-1; i++)//n个数需要排n-1趟
{
   for(j=1; j<=n-i; j++)//每一趟需要比较n-i次大小
   {
   	if(a[j]<a[j+1])//交换位置,从小到大
   	{
   		t=a[j];
   		a[j]=a[j+1];
   		a[j+1]=t;	
   		}	
   }
}

for(i=1;i<=n;i++)//打印排好序的数字
{
   printf("%d\n",a[i]);
}
 
   return 0;

根据分数打印人名:

struct student{
	char name[21];
	char score;
};//创建一个结构体存放姓名和分数

int main(){
	int i,j,n;
	struct student a[100],t;//创建一个数组用来存放姓名和分数
	printf("输入一个n:");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%s %d",&a[i].name,&a[i].score);//分别存入姓名和分数
	}
	//排序
	for(i=1;i<=n-1;i++)
	{
		for(j=1;j<=n-i;j++)
		{
			if(a[j].score<a[j+1].score)//数组中的分数进行比较
			{
				t=a[j];//交换保存着姓名和分数的数组
				a[j]=a[j+1];
				a[j+1]=t;
			}
			
		}
	}
	for(i=1;i<=n;i++)
	{
		printf("%s %d\n",a[i].name,a[i].score);//打印排好序的姓名和分数
	}
	return 0;	
}

时间复杂度为O(n^2)

3.快速排序

二、栈 队列 链表

1.队列

允许在队列的首部进行删除操作(head++),在队列的尾部进行插入操作(tail++);haed用来记录队列的队首(即第一位),tail用来记录队列的队尾的下一个位置。规定:队首和队尾重合时,队列为空。
问题:现有一串数字,删除第一个数字,第二个数字移到队尾;删除第三个数字,将第四个数字移到队尾......
队列是广度优先搜索以及队列优先的Bellman-Ford最短路算法的核心数据结构。
image.png
一般代码实现:

int main()
{
	int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;//初始化队列
	int i;
	head=1;
	tail=10;
	while(head<tail)
	{	printf("%d",q[head]);//打印队首
		head++;//加1,指向新的队首
		
		q[tail]=q[head];//将新的队首移到队尾
		tail++;
		
		head++;	//再将队首出队,进入下次循环
	}
	return 0;
}

结构体实现:

struct queue
{
	int data[100];
	int head;
	int tail;
};
//结构体包含整型数组data、整形head和整形tail,访问其内容,可用`.成员`

int main()
{
	struct queue q;
	q.head=1;
	q.tail=1;
	int i;
	for(i=1;i<=9;i++)
	{
		scanf("%d",&q.data[q.tail]);//初始化队列
		q.tail++;
	}
	while(q.head<q.tail)
	{
		printf("%d",q.data[q.head]);
		q.head++;
		
		q.data[q.tail]=q.data[q.head];
		q.tail++;
		
		q.head++;
		
	}
	return 0;
}

2.栈

栈:后进后出,只能在一端进行插入和删除操作。
回文:正读反读均相同的字符序列,如aha,ahha