第8章:线性时间排序

一:计数排序:

计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数,当k=O(n)时,排序的运行时间为 Θ(n)
代码如下:

void countingSort(vector<unsigned int>& array)
{
        if(array.size()==0)
                throw underflow_error("the array is empty.");

        if(array.size()==1)
                return;

        unsigned int maxValue=0;
        for(int i=0;i!=array.size();++i)
                if(maxValue<=array[i])
                        maxValue=array[i];

        vector<unsigned int> countArray(maxValue+1); // countArray[i] contains the number of elements less than or equal to i;
        vector<unsigned int> sortedArray(array.size());

        for(int i=0;i!=array.size();++i)
                countArray[array[i]]+=1;

        for(int i=1;i!=countArray.size();++i)
                countArray[i]+=countArray[i-1];

        for(int i=array.size()-1;i>=0;--i)
        {
                sortedArray[countArray[array[i]]-1]=array[i];
                countArray[array[i]]--;
        }

        for(int i=0;i!=array.size();++i)
                array[i]=sortedArray[i];
}

二:桶排序:

桶排序假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。与计数排序类似,因为对输入数据作了某种假设,桶排序的速度也很快。具体来说,计数排序假设输入数据都属于一个小区间内的整数,而桶排序假设输入是一个随机过程产生,该过程将元素均匀,独立地分布在[0,1)区间上。
桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后,将n个输入数分别放到各个桶中。因为输入数据是均匀,独立地分布在[0,1)区间上,所以一般不会出现很多书落在同一个桶中的情况。为了得到输出结果,我们先对每一个桶中的数进行排序,然后遍历每一个桶,按照次序把各个桶中的元素列出来即可。
代码如下:

void bucketSort(vector<double>& array)
{
        vector< vector<double> > temp(array.size());

        for(int i=0;i!=array.size();++i)
        {
                temp[(int)(array[i]*array.size())].push_back(array[i]);
                if(array[i]==1)
                        temp[array.size()-1].push_back(array[i]);
        }

        for(int i=0;i!=temp.size();++i)
                if(temp[i].size()!=0&&temp[i].size()!=1)
                        insertionSort(temp[i]);

        int index=0;
        for(int i=0;i!=temp.size();++i)
                if(temp[i].size()!=0)
                        for(int j=0;j!=temp[i].size();++j)
                                array[index++]=temp[i][j];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值