#include <stdio.h> //标准输入输出库用于调用我们的scanf和printf
#include <stdlib.h> //包含了我们的qsort函数用于快速排序

int compare(const void* a, const void* b) { //定义了一个比较函数,在qsort函数进行排序时中比较两个元素的大小,它接受两个void*类型的指针函数
    return *(int*)a - *(int*)b; //将其转换为int*类型后,返回两个整数的差值,从而实现从小到大的排序
}

int main() { //主程序开始
    int n; //定义一个整数n,用来存储我们的N
    scanf("%d", &n); //将第一行的N读取进n
    int countArray[501] = {0}; // 定义一个整数数组,将其值初始化为0,用于记录数字出现次数
    int resultArray[n]; // 用于存储去重后的数字
    int resultCount = 0; // 用于储存不重复的数字的个数(qsort时需要使用)
    for (int i = 0; i < n; i++) { //遍历数据
        int num; //用于存储数据
        scanf("%d", &num); //将数据储存到num中
        if (countArray[num] == 0) { //如果这个数字还没有出现过
            resultArray[resultCount++] = num; //把这个数字存储到resultArray的第resultCount位置
            countArray[num]++; //将此数次出现次数加一
        }
    }
    qsort(resultArray, resultCount, sizeof(int), compare); //对结果进行排序
    for (int i = 0; i < resultCount; i++) { //遍历结果
        printf("%d\n", resultArray[i]); //输出每一行
    }
    return 0;
}

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.给你一个数字n代表数据的个数(n的范围是1<=n<=1000)

2.给你n个数据,每个数据都是一个1到500之间(包括1和500)的整数

3.去除重复的数据(数值相同的只保留一个)

4.对数据进行排序(从小到大)

5.并输出

二、解题思路

1.首先我们读取第一行,也就是数据的行数n

2.然后我们为了节省时间,一边读取一边判断是否重复

3.为了判断是否重复出现我们需要一个判断重复的方法,这里想到比较简单的

方法就是定义一个数组,大小是500,将数组的默认值都设为0,然后开始遍历数据,遍历数据的时候,如果之前是0的话出现了一次的数字就加1,并且放在另外一个数组中(专门用来储存去重之后的数据)如果已经是1了就跳过。

4.对我们储存去重之后的数据的数组进行排序,这里使用快速排序qsort

5.输出结果

这里需要注意的是qsort

使用方法是qsort(需要排序的数组,数组中元素的数量,元素的大小,比较函数)