《算法导论》 上的计数排序

《算法导论》 上的计数排序
文章图片
#include < iostream >
《算法导论》 上的计数排序
文章图片
#include < string >
《算法导论》 上的计数排序
文章图片
using namespace std;
《算法导论》 上的计数排序
文章图片
const int MaxN = 40 ;
《算法导论》 上的计数排序
文章图片

《算法导论》 上的计数排序
文章图片
void counting_sort( int A[], int B[], int k)
《算法导论》 上的计数排序
文章图片
《算法导论》 上的计数排序
文章图片
... {
《算法导论》 上的计数排序
文章图片
int C[MaxN];
《算法导论》 上的计数排序
文章图片
//for(int i = 0; i < MaxN; i++)
《算法导论》 上的计数排序
文章图片
//C[i] =0; //初始化
《算法导论》 上的计数排序
文章图片
memset(C, 0, sizeof(C)/sizeof(C[0]));
《算法导论》 上的计数排序
文章图片
for(int i = 0; i < k; i++)
《算法导论》 上的计数排序
文章图片
C[A[i]] = C[A[i]] + 1; //C[i]包含元素值是i的个数
《算法导论》 上的计数排序
文章图片
// cout<<"C["<
《算法导论》 上的计数排序
文章图片
for(int j = 1; j < k; j++)
《算法导论》 上的计数排序
文章图片
C[j] = C[j] + C[j-1]; //C[i]包含等于或小于i的元素的个数
《算法导论》 上的计数排序
文章图片
for(j = k-1; j >= 0; j--)
《算法导论》 上的计数排序
文章图片
《算法导论》 上的计数排序
文章图片
...{
《算法导论》 上的计数排序
文章图片
B[C[A[j]]-1] = A[j];
《算法导论》 上的计数排序
文章图片
C[A[j]] = C[A[j]] -1;
《算法导论》 上的计数排序
文章图片
}//对于每个A[j], 值C[A[j]]即为A[j]在输出数组中的最终位置,因为共有C[A[j]]
《算法导论》 上的计数排序
文章图片
//个元素小于等于A[j].由于各个元素可能不一定是不同的,因此,每当将一个值A[j]放在数组B中,
《算法导论》 上的计数排序
文章图片
//都要减小C[A[j]]的值。
《算法导论》 上的计数排序
文章图片

《算法导论》 上的计数排序
文章图片

《算法导论》 上的计数排序
文章图片
}
《算法导论》 上的计数排序
文章图片

《算法导论》 上的计数排序
文章图片
int main()
《算法导论》 上的计数排序
文章图片

《算法导论》 上的计数排序
文章图片
《算法导论》 上的计数排序
文章图片
... {
《算法导论》 上的计数排序
文章图片
《算法导论》 上的计数排序
文章图片
int A[6]=...{4,4,5,1,1,1};
《算法导论》 上的计数排序
文章图片
int B[MaxN];
《算法导论》 上的计数排序
文章图片
memset(B, 0, MaxN);
《算法导论》 上的计数排序
文章图片
counting_sort(A, B, 6);
《算法导论》 上的计数排序
文章图片

《算法导论》 上的计数排序
文章图片
for(int i = 0; i < sizeof(A)/sizeof(A[0]); i++)
《算法导论》 上的计数排序
文章图片
cout<<"B["<《算法导论》 上的计数排序
文章图片

《算法导论》 上的计数排序
文章图片
return 0;
《算法导论》 上的计数排序
文章图片
}
《算法导论》 上的计数排序
文章图片
// 《算法导论》中:计数排序的思想就是对每一个输入元素x,确定出小于x的元素个数
《算法导论》 上的计数排序
文章图片
// 但是我觉得计数排序的应用范围太狭小了,对于元素相差较大者,不易使用。
《算法导论》 上的计数排序
文章图片
// 如果按照元素的比较方法来实现到可以克服这个问题,但是计算排序的效率高就在于不比较元素之间的
《算法导论》 上的计数排序
文章图片
// 大小来实现。否则,效率一定会降低,而且演化成比较排序。

    推荐阅读