第8章:线性时间排序

来源:互联网 发布:电脑软件 知乎 编辑:程序博客网 时间:2024/06/07 21:11

一:计数排序:

计数排序假设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];
0 0
原创粉丝点击