#include
#include
//计数排序 会损耗空间
#define N 100000
void sort(int*a,int lengh)
{
int helper[N],source[N],i=0,k=0;
memset(helper,0,sizeof(helper));
memset(source,0,sizeof(helper));
for(i;i {
helper[a[i]]++;
}
for(i=0;i {
while(helper[i]>0)
{
printf("%d %d",k,i);
source[k++]=i;
// printf("%d %d",k,i);
helper[i]--;
printf("\n");
}
}
for(i=0;i<lengh;i++)
printf("%d",source[i]);
}
main()
{
int a[]={2,1,4,5,7,8,9}
//int a[]={36,54,89,78,21,56,42};
sort(a,sizeof(a)/4);
}
这计数排序只能识别个位数排序,能帮我改进一下吗?
如何提升输出效率?
代码放到代码片里,不然会有消失一部分代码
可以使用两个变量确定边界,这样输出的时候就不需要从0-N来判断
#include<stdio.h>
#include<string.h>
//计数排序 会损耗空间
#define N 100000
void sort(int* a, int lengh)
{
int helper[N], source[N], i = 0, k = 0;
int begin = N, end = 0;
memset(helper, 0, sizeof(helper));
memset(source, 0, sizeof(helper));
for (i = 0; i < lengh; i++) {
helper[a[i]]++;
if (a[i] < begin)
begin = a[i];
if (a[i] > end)
end = a[i] + 1;
}
for (i = begin; i < end; i++) {
while (helper[i] > 0)
{
printf("%d %d", k, i);
source[k++] = i;
// printf("%d %d",k,i);
helper[i]--;
printf("\n");
}
}
for (i = 0; i < lengh; i++)
printf("%d", source[i]);
}
int main()
{
int a[] = { 2,1,4,5,7,8,9 };
//int a[]={36,54,89,78,21,56,42};
sort(a, sizeof(a) / 4);
return 0;
}