您的位置:首页 > 其它

计数排序

2015-08-19 12:57 281 查看
计数排序是一个非比较的线性时间排序算法,时间复杂度为O(n),是稳定算法。该算法有一个前提条件:要排序的n个元素都是在[0,k)范围的整数,其中k是某个整数。

计数排序的基本思想是:对每一个元素x,确定了小于x的元素的个数,然后直接把x放到数组对应的位置上。需要一个临时数组保存每个元素的个数。

C语言代码如下:
#include <iostream>
using namespace std;

/*
arr为输入数组, ret为输出数组,len为数组长度
lower表示数组下限, upper表示数组下限
/*
void calcSort(const int* arr, int* ret, int len, int lower, int upper)
{
if (NULL == arr || NULL == ret)
{
return;
}

int* tmp = new int[upper-lower];

for (int i = 0; i < upper - lower; ++i)
{
tmp[i] = 0;
}

for (int i = 0; i < len; i++)
{
tmp[arr[i] - lower] += 1;
}

for (int i = 1; i < upper - lower; i++)
{
tmp[i] += tmp[i-1];
}

for (int i = len - 1; i >= 0; --i)
{
ret[tmp[arr[i] - lower]-1] = arr[i];
tmp[arr[i] - lower]--;
}

delete[] tmp;
}

int main()
{
int arr[] = {20,28,26,25,23,24,21,24,25,28,29,25,27,29};
int ret[20] = {0};
int len = sizeof(arr)/sizeof(*arr);

calcSort(arr, ret, len, 20, 30);

for (int i = 0; i < len; i++)
{
cout << ret[i] << " ";
}
cout << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: