第8章:线性时间排序

原创 2016年05月30日 22:16:45

一:计数排序:

计数排序假设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];
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

算法导论代码 第8章 线性时间排序

第8章 线性时间排序 8.2 计数排序 #include #include #include #include void counting_sort(int A[], int n, i...

《算法导论》第8章 线性时间排序 个人笔记

第8章 线性时间排序8.1 排序算法的下界 8.2 计数排序 8.3 基数排序 8.4 桶排序

2011-03-06 算法导论 第8章 线性时间排序

2011-03-06 算法导论 第8章 线性时间排序:计数排序,基数排序,桶排序

算法导论 第8章 线性时间排序 C++实现

#ifndef CHAPTER8_H #define CHAPTER8_H //CLRS chapter 8- sorting in linear time //by full_speed_turbo...

算法导论:第8章 线性时间排序__计数排序

/* 计数排序:n个元素都是0到k范围得整数,当k=O(n)时,排序运行时间为O(n) 思想:对于数x,确定小于x的个数m,将x放在第m+1个位置上 例子:假设3个元素小于x,那么x应该放在4上 输...

《算法导论》第8章 线性时间排序 (1)计数排序

一种简单的实现是得到数组C,C[i]表示数组A中值为i的元素个数。 C = { 2, 0, 2, 3, 0, 1 }就表示两个0,两个2,三个3,一个5。 然后将这些数字依次存到数组B中。 ...
  • dc_726
  • dc_726
  • 2012-02-19 15:32
  • 1531

算法导论:第8章 线性时间排序__基数排序

/* 基数排序: 含义:用在卡片机上的排序算法。 特点:从最低位进行排序,稳定,d位数需要d趟 适用:对年月日的排序 引理:n个d位数,每个数有k个可能的取值,基数排序采用稳定排序。耗时O(d(n+k...

算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)

/* * 算法导论 第八章 线性时间排序 * 计数排序、基数排序和桶排序 */ #include #include #include #include using namespace ...

算法导论 第8章 线性时间排序-计数排序的原址排序

//FILE:LINEAR_SORT.CPP //实现CLRS第8章计数排序 //实现计数排序的原址排序 #include #include using namespace std; //实现C...

线性时间排序算法

  • 2011-12-12 09:30
  • 501KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)