计数排序法代码实现

计数排序是一种高效的线性排序,也是一种稳定的排序算法。它不是基于比较排序,

事实上没有进行一次数据间的比较,因此它的运行效率也比较高。

 

分为四个步骤

1、先遍历一遍数组,找出其中最大元素;
2、统计数组中每个值为i的元素出现次数(允许数据重复),存入count_arry的第i项;
3、对所有的计数累加(从count_arry的第二个元素起,也就是count_arry[1])每一项和前一项相加;
4、反向遍历原数组,将每个元素i放在新数组的第count_arry[i]项,每放一个元素就将count_arry[i]减1。


以下是c++代码实现:

int maxData =

pData

[0];

 for ( i = 1; i < nLen; i++)

{   

        if (pData[i] > maxData)  

       {
             maxData = pData[i];    

        }

 }  


//pData:待排序数组
//nLen: 数组长度
//maxData:数组中最大值

int CountSort(int* pData, int nLen, int maxData)
{
int i = 0;//用于循环
int* pCout = NULL;            //保存记数数据的指针
pCout = (int*)malloc(sizeof(int) * (maxData+1));    //申请空间,注意要+1

//初始化记数为0
memset(pCout, 0, (maxData+1)*sizeof(int) );

//记录排序记数
for (i = nLen - 1; i >=0; i--)
{
pCout[pData[i]]++;        
}

//累计求和,确定不比该位置大的数据个数。它保持相等的元素输入时的顺序排序后不变
for (i = 1; i <= maxData; i++)
{
pCout[i] += pCout[i - 1];  
}

int* pSort = NULL;           //保存排序结果的指针
pSort = (int*)malloc(sizeof(int) * (nLen+1));    //申请空间

 
for (i = nLen - 1; i >= 0; i--)
 
{
pSort[pCout[pData[i]] - 1] = pData[i];        
pCout[pData[i]]--;    //因为有相同数据的可能,所以要把该位置数据个数减一。
}

//排序结束,复制到原数组中。
for (i = nLen; i > 0; i--)
{
pData[i] = pSort[i];
}

//最后要注意释放申请的空间。
free(pCout);
free(pSort);
return 1;
}

计数排序是典型的以空间换时间的算法,对数组中存在很大元素的数组,比较费空间,同时时间复杂度也呈线性增长。

你可能感兴趣的:(排序算法)