桶式排序
桶式排序适用于那些数组中的元素为有界的情况,比如说以下算法中元素的界限为0~max
桶式排序是通过一个计数器数组来存储待排序数组中每个元素值的个数,然后通过累加计数器中的值,分别得出每种元素值的最末位置
最后通过元素的位置将元素放到数组中即可,从后往前放是为了保持算法的稳定性
桶式排序的时间代价为O(max+n),空间代价为O(max)
桶式排序适用于那些数组中的元素为有界的情况,比如说以下算法中元素的界限为0~max
桶式排序是通过一个计数器数组来存储待排序数组中每个元素值的个数,然后通过累加计数器中的值,分别得出每种元素值的最末位置
最后通过元素的位置将元素放到数组中即可,从后往前放是为了保持算法的稳定性
桶式排序的时间代价为O(max+n),空间代价为O(max)
#ifndef BUCKETSORT_H
#define BUCKERSORT_H
#include <iostream>
template<typename T>
class BucketSort{
public:
void bucketSort( T *,int,int );
void printArr( T *,int );
};
/**
* 桶式排序法
*/
template<typename T> void BucketSort<T>::bucketSort( T *sortedArr,int arrLength,int max )
{
int *count=new int[max+1];
T *temp=new T[arrLength];
for( int i=0;i<max+1;++i )
count[i]=0;
/**
* 对相同的值计数
*/
for( int i=0;i<arrLength;++i )
{
++count[ sortedArr[i] ];
temp[i]=sortedArr[i];
}
/**
* 求出累加和
*/
for( int i=1;i<max+1;++i )
count[i]+=count[i-1];
/**
* 此处--count[ temp[i] ]不仅仅求出了temp[i]应该存放的位置,而且对象的计数值减了1,使得求出了temp[i]应该在的位置
* 此处从arrLength-1开始是为了稳定性
*/
for( int i=arrLength-1;i>=0;--i )
sortedArr[ --count[ temp[i] ] ]=temp[i];
delete [] count;
delete [] temp;
}
template<typename T> void BucketSort<T>::printArr( T *sortedArr,int arrLength )
{
for( int i=0;i<arrLength;++i )
{
std::cout<<sortedArr[i]<<" ";
}
}
#endif
5525

被折叠的 条评论
为什么被折叠?



