题目如下
对0到1000000之间的n个整数进行排序,要求时间复杂度是O(n)
解题思路
1、我们可以定义一个长度为1000000的数组brr,然后全部初始化为0
2、从头到尾遍历这n个数字,出现哪个数字就将其作为数组的下标,然后在这个数组下标对应的元素值进行加1操作 (哈希函数为y=x)
3、然后从头到尾遍历brr,数组下标对应的元素值是多少,就把这个下标值打印几次。
解题代码
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void Sort(int* arr, int n)//时间复杂度O(n),空间复杂度O(数据的取值范围)
{
int i;
for (i = 0; i < n; i++)
{
if (arr[i] < 0 || arr[i] >= 1000000)
{
printf("数据不在范围内,错误\n");
return;
}
}
int* brr = (int*)calloc(1000000, sizeof(int));//calloc将每个值初始化为0
assert(brr != NULL);
for (i = 0; i < n; i++)
{
brr[arr[i]]++;//哈希函数y = x = arr[i]
}
i = 0;
for (int j = 0; j < 1000000; j++)
{
for (int k = 0; k < brr[j]; k++)
{
arr[i++] = j;
}
}
free(brr);
}
int main()
{
int arr[] = { 7,3,2,77,10000,45863,222,1,9,666,333,111,4521 };
int len = sizeof(arr) / sizeof(arr[0]);
Sort(arr, len);
for (int i = 0; i < len; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}