如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
一个很有意思的题目
在数字范围有限制的情况下,如n=100,只需要用一个数组记录每个数字出现次数就可以了。
定义一个数组a[100](这个空间是常量,和n无关,所以空间复杂度是O(1) )
扫描一遍输入的待排序列,a[t]++,时间复杂度为O(n)
有几个相同的输入数值t,a[t]就等于多少,当a[t]>0时,输出,即可得到排序后的数
#include<stdio.h>
int a[100];
int main() {
int n;
scanf_s("%d", &n);
int i, j, t;
for (int i = 1; i <= n; i++) {
scanf_s("%d", &t);
a[t]++;
}
for (int i = 0; i < 100; i++) {
for (int j = 0; j < a[i]; j++)
printf("%d ", i);
}
}