第十三周总结

本文详细讲解了选择排序的实现,比较了它与冒泡排序的异同,演示了如何通过去重和队列操作处理随机数,适合编程入门学习。
摘要由CSDN通过智能技术生成

选择排序

题目描述

给定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),称为空队列。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值