思路
就是说数组的下标是有序的,给定一个长度很大的辅助数组
待排序的数值等于辅助数组的下标
下标位置的值加一
输出的时候输出辅助空间下标,输出的次数是这个下标的值。
比如 待排序数组为:9 3 4 7 8 4;
下标:1 2 3 4 5 6 7 8 9
值: 0 0 1 2 0 0 1 1 1
排好序为: 3 4 4 7 8 9
代码
int main(){
int a[10];
int b[5]={7,3,1,2,4};
int table[10];
for(int i=0;i<10;i++){
table[i]=0;
}
for(int i=0;i<5;i++){
table[b[i]]++;
}
for(int i=0;i<10;i++){
if(table[i]) printf("%d ",i);
}
printf("\n");
return 0;
}
举一反三
/*
找出n个数中的最小正整数
最小正整数一定在1~n+1其中一个数
统计出现在1~n+1其中的数
最小的未出现的数是最小正整数
*/
int minPositiveInteger(int a[],int n) {
int* min = (int *)malloc(sizeof(int)*n);//辅助空间
//辅助空间赋值为0
for (int i = 0; i < n; i++)
{
min[i] = 0;
}
//统计
for (int i = 0; i < n; i++)
{
if (a[i] > 0 && a[i] < n + 1) min[a[i] - 1]=1;
}
for (int i = 0; i < n;i++) {
if (min[i] == 0) return i+1;
}
return n + 1;
}