问题描述(难度⭐)
读取多组数据,对每组数据进行冒泡排序,然后去除重复元素后输出。
输入
首先输入一个正整数T(0<T<20)
对于每组数据,首先输入一个正整数n(0<n<100)表示有n个数,然后输入n个整数(均在int范围内)
输出
对于每一组数据,将这n个整数升序排列,然后输出,要求同一数字仅输出一次,数字间用空格隔开。每组输出单独占一行。
样例
输入 5 输出 1 2 3
3 2 2 1 1
代码思路
-
读取测试用例数量:
- 使用
scanf
读取一个整数T
,表示测试用例的数量。
- 使用
-
处理每个测试用例:
- 使用
while
循环,循环T
次,每次处理一个测试用例。 - 在每次循环中:
- 读取一个整数
n
,表示当前测试用例中数组的长度。 - 声明一个长度为
n
的整数数组arr
。 - 使用
for
循环读取n
个整数,存储到数组arr
中。
- 读取一个整数
- 使用
-
调用冒泡排序函数:
- 调用
bubble
函数对数组arr
进行冒泡排序。
- 调用
-
去除重复元素并输出:
- 使用
for
循环遍历数组arr
的前n-1
个元素:- 如果当前元素
arr[i]
与下一个元素arr[i+1]
不相等,则输出当前元素arr[i]
。 - 最后输出数组的最后一个元素
arr[n-1]
。
- 如果当前元素
- 使用
-
冒泡排序函数
bubble
:- 使用两个嵌套的
for
循环实现冒泡排序:- 外层循环从
n-1
递减到1
,表示每次排序的范围。 - 内层循环从
0
到i-1
,用于比较相邻元素。 - 如果当前元素
arr[j]
大于下一个元素arr[j+1]
,则交换这两个元素。
- 外层循环从
- 使用两个嵌套的
详细代码 (C语言版)
#include<stdio.h>
#include<string.h>
// 函数声明
void bubble(int arr[], int n);
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]); // 读取数组元素
}
bubble(arr, n); // 调用冒泡排序函数
// 先遍历n-1个元素输出
for (int i = 0; i < n - 1; i++) {
if (arr[i] != arr[i + 1]) { // 如果当前元素与下一个元素不相等
printf("%d ", arr[i]); // 输出当前元素
}
}
// 输出最后一个元素
printf("%d\n", arr[n - 1]);
}
return 0;
}
// 冒泡排序函数
void bubble(int arr[], int n) {
for (int i = n - 1; i > 0; i--) { // 外层循环,从n-1递减到1
for (int j = 0; j < i; j++) { // 内层循环,从0到i-1
if (arr[j] > arr[j + 1]) { // 如果当前元素大于下一个元素
int mid = arr[j]; // 交换两个元素
arr[j] = arr[j + 1];
arr[j + 1] = mid;
}
}
}
}