选择排序
题目描述
给定N个整数,请你对这些整数进行升序排列并输出。
输入
输入数据有多组,第一行是测试数据的组数T,接下的T行中,每行表示一组测试数据,每组测试数据的第一个数字为N(1<=N<=1000),接下来是N个整数。本题中,所有的整数都在32位之内。
输出
输出每组测试数据排序后的结果。每组测试数据占一行。
样例输入
2
3 2 1 3
4 1 3 4 2
样例输出
1 2 3
1 2 3 4
#include <stdio.h>
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int N;
scanf("%d", &N);
int arr[N];
for (int i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
for (int i = 0; i < n - 1; i++)
{
int min = i;
for (int j = i + 1; j < n; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
for (int i = 0; i < N; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
return 0;
}
其实他的核心部分跟冒泡排序差不多,都是两层for循环嵌套。但是相较于冒泡排序他的外层循环多了一步,他在外层循环遍历整个数组时,定义了一个变量min来储存内层循环遍历整个数组所找出的最小值,然后在进入外层循环。这样一遍一遍的找最小值,最后就达到了排序的目的。整个程序就是一遍遍的遍历数组找出此时的最小值,就像选择一个数来给最小值。
二、去重排序
题目描述
LY学长想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助LY学长完成“去重”与“排序”的工作。
输入
输入数据有2行,第1行为1个正整数,表示所生成的随机数的个数:N
第2行有N个用空格隔开的正整数,为所产生的随机数。
输出
输出有2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
样例输入 复制
10
20 40 32 67 40 20 89 300 400 15
样例输出 复制
8
15 20 32 40 67 89 300 400
#include <stdio.h>
int main()
{
int a[1001], n, j;
for (int i = 1; i <= 1000; i++)
a[i] = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &j);
a[j] = 1;
}
int count = 0;
for (int i = 1; i <= 1000; i++)
{
if (a[i] == 1)
count++;
}
printf("%d\n", count);
for (int i = 1; i <= 1000; i++)
{
if (a[i] == 1)
printf("%d ", i);
}
return 0;
}
首先,定义一个长度为1001的整数数组a,以及变量n和j。
使用for循环将数组a的所有元素初始化为0。
通过scanf()函数从用户输入读取一个整数n。
再使用一个for循环,从用户输入读取n个整数,并将其作为索引更新数组a的值。如果某个位置的索引被读取到,则将该位置的数组元素设为1,表示这个位置已被访问过。
定义一个变量count用于统计数组a中值为1的元素个数,初始值为0。
使用一个for循环遍历数组a,每当遇到值为1的元素时,将count加1。
输出计数值count。
再次使用一个for循环遍历数组a,每当遇到值为1的元素时,输出对应的索引i。
这样不仅排了序(类似桶排序)还去了重。
三、队列(解密QQ号)
小明向他的新同桌小李要QQ号,但是小李并没有直接告诉小明,而是给了他一串加过密的数字,同时告诉小明密码的解密规则:首先将这一串数字的第一个数删除,然后将第二个数放到这串数字的末尾,再将第三个数字删除,再将第四个数放到这串数的末尾,以此类推,直到剩下最后一个数,然后将最后一个数也删除。按照刚才删除的顺序,把这些数字连在一起就是他的QQ号了。请你帮助一下小明。
#include<stdio.h>
int main()
{
int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;
head=1;
tail=10;
while(head<tail)
{
printf("%d",q[head]);
head++;
q[tail]=q[head];
tail++;
head++;
}
return 0;
}
首先定义并初始化了一个数组来储存这一串代数即q[101],然后定义了head,tail两个变量来代表队首和队尾。然后就是第一步删除第一个数(输出这个数),然后将head向后移一位,将他的值与队尾的值交换达到第二步的目的注意这时需要将head和tail同时向后移一位。这就是解密过程的最基本单元了,然后通过一个while循环来重复执行这个步骤,最后就得到了正确的qq号。
总的来说,队列是一种特殊的线性结构,他只允许队列的首部(head)进行删除操作,这称为“出队”,而在队列的尾部(tail)进行插入操作,这称为“出队”。当队列中没有元素时(即head=tail),称为空队列。