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

几种线性时间排序

一般我们使用的堆排序,归并排序都是属于比较排序,也就是通过比较元素的大小来进行排序,可以通过决策树分析出比较排序的时间下界是O(nlgn),堆排序和归并排序都是渐进最优的比较排序算法。还有其他的排序方...
  • SeasonJoe
  • SeasonJoe
  • 2016年07月26日 20:53
  • 824

算法导论第八章线性时间排序课后答案

8.1-1 在一颗比较排序算法的决策树中,一个叶结点可能的最小深度是多少? 最少进行n-1次比较,所以深度最小是n-1 8.1-2不用斯特林近似公式,给出lg(n!)的渐近紧确界,利用A.2节...
  • z84616995z
  • z84616995z
  • 2014年01月19日 14:09
  • 4796

【万字总结】快速排序详解与各种线性时间排序对比

什么是快速排序快速排序简介快速排序(英文名:Quicksort,有时候也叫做划分交换排序)是一个高效的排序算法,由Tony Hoare在1959年发明(1961年公布)。当情况良好时,它可以比主要竞争...
  • NoMasp
  • NoMasp
  • 2015年12月19日 21:27
  • 3262

计数排序(第8章线性时间排序)

根 #include #include #include #include /****************************************************...
  • u012102997
  • u012102997
  • 2014年04月23日 14:56
  • 293

桶排序(第8章:线性时间排序)

#include "Link_List.h" #define Length 10 /*桶排序的算法,其中对链表的排序采用的是冒泡*/ void main() {    double A[Le...
  • u012102997
  • u012102997
  • 2014年04月28日 16:38
  • 274

算法导论学习之线性时间排序

在没有限定条件的情况下,目前的排序算法的最好的时间复杂度大都在O(n lgn)左右,而当加入了一些限定条件后,一些排序算法可以达到线性的时间复杂度。下面让我们来看两个线性时间复杂度的排序算法。 一计数...
  • weiyongle1996
  • weiyongle1996
  • 2017年04月25日 16:21
  • 122

算法导论学习之线性时间排序+排序算法稳定性总结

前面我们学习的几种排序算法都是基于比较的,对于任何输入数据他们都是适用的,其最坏的时间复杂度不会低于nlgn; 但对于一些比较特殊的输入数据,我们可以不采取比较的方法而是采用其它的方法对其进行排序,...
  • acm_lkl
  • acm_lkl
  • 2015年03月13日 17:55
  • 832

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

前面介绍的算法都有一个共同的性质:排序结果中,各元素的次序基于输入时间的比较,我们把这类排序算法称为比较排序。   8.1比较排序算法的时间下界 决策树模型 比较排序的过程可以被抽象地视为决策...
  • u014627487
  • u014627487
  • 2015年01月14日 11:01
  • 193

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

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

《算法导论》9、三个线性时间排序(C++)

1、计数排序 #include #include using namespace std; int* countingSort(int *A, int n, int k) { int *B ...
  • zcy19941015
  • zcy19941015
  • 2015年05月19日 21:36
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第8章:线性时间排序
举报原因:
原因补充:

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