您的位置:首页 > 其它

计数排序

2014-05-11 17:04 183 查看
       计数排序的基本思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它的输出数组中的位置上了。首先利用一个辅助数组,数组大小是所有元素的最大值K+1,C[0....K],数组下标就是对应的元素。统计每个元素出现的次数存入数组C,然后计算每个元素前面替他元素出现的个数。将数组A的元素根据数组C的信息按顺序排列在输出数组B上。

#include <stdio.h>
#include <malloc.h>

void Count_sort(int A[], int B[], int k, int length)
{
int i = 0;
/*统计每个元素出现次数的临时辅助数组,下标对应元素的值*/
int *C = (int *)malloc( sizeof(int) * (k+1) );

if( C != NULL )
{
for(i=0; i <= k; i++)
{
C[i] = 0;  //初始化为0
}
}
else
return;

for(i=0; i < length; i++)
{
C[A[i]] += 1;  //统计每个元素出现的次数
}

for(i=1; i <= k; i++)
{
C[i] += C[i-1];   //计算每个元素前面有多少其他的元素
}

/*从数组A的最后一个元素开始排列,寻找对应的位置即C[A[i]-1]为下标位置
放入数组B*/
for(i = length-1; i >= 0; i--)
{
B[ C[ A[i] ] - 1 ] = A[i];
C[ A[i] ] -= 1;
}

free(C);
}

int main(int argc, char *argv[])
{
int i = 0;
int A[] = {5, 2, 4, 6, 1, 3, 1, 1, 23, 45, 22, 0, 4};
int length = sizeof(A) / sizeof(A[0]);

int *B = (int *)malloc(sizeof(int) * length);

Count_sort(A, B, 50, length);

for(i=0; i < length; i++)
{
printf("%d  ", B[i]);
}

free(B);

printf("Press enter to continue ...");
getchar();
return 0;

}


计数排序算法的时间复杂度为O(n+k),当k较小时,即元素的最大值较小,k = O(n)时, 这时运行时间为O(n)。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: