看到一道算法面试题,比较有趣,我自己用C做了一下。
题目:随机生成10个100以内的整数,把数据从小到大排序,而且算法复杂度只能是1。
这个算法比较有意思的地方是,首先建立一个数组B,其元素个数为数组A的最大元素值,然后用A的元素作为B的数组下标,然后给存在的B元素赋值,这样就可以用循环把下标输出出来。
C程序如下:
#include
#include
#include
#define random(x) (rand()%x)
main()
{
int lengthA, lengthB, i;
int wait;
int arrayA[10]; // 定义一个数组
int arrayB[101];
srand(time(NULL)); // 让每次产生的随机数都不一样
lengthA = sizeof(arrayA) / sizeof(arrayA[0]);
lengthB = sizeof(arrayB) / sizeof(arrayB[0]);
// 给数组赋值
for(i = 0; i < 10; i++)
arrayA[i] = random(100);
printf("随机生成的数组A的元素为 \n");
// 输出数组
for(i = 0; i < 10; i++)
printf("%d\n", arrayA[i]);
for (i = 0; i < lengthA; i++)
{
arrayB[arrayA[i]] = 101;
}
printf("排序后的结果为\n");
for (i = 0; i < lengthB; i++)
{
if (arrayB[i] == 101)
printf("%d\n", i);
}
//printf("%d", lengthA);
scanf("%d", &wait);
}
程序运行结果:
随机生成的数组A的元素为
79
62
87
43
32
52
72
88
44
53
排序后的结果为
32
43
44
52
53
62
72
79
87
88