完整题目:
老师给了小乐乐一个正整数序列,要求小乐乐把这个序列去重后按从小到大排序。但是老师给出的序列太长了,小乐乐没办法耐心的去重并排序,请你帮助他。
输入描述:
第一行包含一个正整数n,表示老师给出的序列有n个数。接下来有n行,每行一个正整数k,为序列中每一个元素的值。(1 ≤ n ≤ 105,1 ≤ k ≤ n)
输出描述:
输出一行,为去重排序后的序列,每个数后面有一个空格。
输入:
4 2 2 1 1
输出:
1 2
输入:
5 5 4 3 2 1
输出:
1 2 3 4 5
算法:按照下标(下标本身是有序的)存放数据——既去重又排序。
实现代码:
#include <stdio.h>
int main()
{
int arr[100001] = { 0 };
int n = 0;
int k = 0;
int i = 0;
//输入
scanf("%d", &n);
for (i = 0; i < n; i++)循环输入n个数
{
//每读取一个整型就把这个整型放进去
scanf("%d", &k);
arr[k] = k;//每读取一个整型k就把这个k整型放进arr数组下标为k的位置
}//完成去重和排序
//输出:
//打印数组中非0的是数字
for (i = 0; i < 100001; i++)//遍历数组的每一位
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}
优化:
i<100001——>i<n
局部数组放在栈区对栈区空间耗费严重,可以把数组定义在全局中使数组放在静态存储区。
#include <stdio.h>
int arr[100001] = { 0 };
int main()
{
int n = 0;
int k = 0;
int i = 0;
//输入
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &k);
arr[k] = k;
}
//输出
for (i = 0; i < n; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}
这种算法不能放负数,空间浪费严重,但是效率高,用时间换取空间。