排序算法之计数排序

原创 2013年12月03日 08:50:13

               计数排序是一种非比较的排序,这种方法思路大概是先算出待排序数据里面的数字分别出现多少次,然后再依据这个存放进新的数组里面,输出这个数组,排序也就完成了。时间复杂度为o(n+k),很多人说是o(n),但其实只是接近而已。其中里面的n是排序的数据个数,而k是排序中最大的值,可想而知,在n确定的情况下,k的值越小,时间复杂度越低,例如就算n很小,但排序数是{2,5,3,10000}的话,那也需要很多时间,此排序方法就不怎么适用了。

               程序例子:(主要参考排序核心方法,其他的写得不够好)

               

#include <iostream>  
using namespace std; 
//------------------------- 
int data[100];//全局变量,用来存放待排序数据
int array_length;//数组的长度
int array_max;//数组中最大的值,也就是k
//---------------------------------
//初始化数组
void Init_array()
{
	cout<<"Input:(End with 1000)";
	for(int i=0;; i++)
	{
		cin>>data[i];
		if(data[i]==1000)
		{
          	array_length = i;//由此获得数组长度
			break;
		}
	}
}
//-----------------------------------
//求数组中最大的数
void max_array()
{
	int t;
	array_max = data[0];
    for(int i=0; i<array_length-1; ++i)
	{
		if(data[i]<data[i+1])
		{
			array_max = data[i+1];
		}
		else
		{
			t = data[i];
			data[i] = data[i+1];
			data[i+1] = t;
		}
	}
}  
//----------------------------------
//计数排序
//参数分别是1.待排序数组,2.数组长度,3.待排序数组中最大的值,也就是k
void sort_counter(int d[], int n, int k)  
{  
    int i, j = 0,p = 0;
    // 实际需要的空间比K大1  
    k++;
	//辅助数组,当然也可以用其他编程技术来代替
	int counter[100] = {0};
    // 计数    
    for(i=0; i<n; ++i)  
    {  
		p = d[i];
        counter[d[i]]++;  //counter数组下标为排序的数,下标对应的数组值为这个数出现的次数
    }  
    //将计数结果保存到待排数据数组  
    for(i=0; i<k; ++i)  
    {  
        while(counter[i]-- > 0)  //将出现的数字以及次数,依次放到数组中
        {  
            d[j++] = i;  
        }  
    } 
}  
//主函数 
int main(void)  
{  
	Init_array();
	max_array();
    sort_counter(data, array_length-1, array_max);  
    int i;  
    for(i=0; i<array_length; ++i)  
    {  
        cout<<data[i]<<" "; 
    } 
	cout<<endl;
    return 0;  
}  
 

            运行结果:

            

版权声明:本文为博主原创文章,未经博主允许不得转载。

排序算法之线性排序(计数排序和桶排序)--Java语言

之前的文章讲到的都是比较算法,以下链接是之前文章提到过的一些基本排序方法,其时间复杂度的下界是O(nlogn)。今天提到的两个主角分别是计数排序和桶排序,其时间复杂度好的情况下能够达到O(n),它们不...
  • carson0408
  • carson0408
  • 2017年11月28日 15:19
  • 626

计数排序及C语言实现

计数排序及C语言实现
  • bing_bing304
  • bing_bing304
  • 2014年11月25日 22:04
  • 936

算法数据结构C++实现4-计数排序(counting sort)

这里是 Introduction to Algorithm 算法导论书中第八章的计数排序 counting sort, 本专题还是以这本书为主,用c++实现其中最重要的算法。 网上也有很多高手研究了这...
  • kenden23
  • kenden23
  • 2013年10月08日 16:08
  • 1731

经典算法——计数排序算法

计数排序: 该算法于1954年由 Harold H. Seward 提出。 它是一个不需要比较的,类似于桶排序的线性时间排序算法。该算法是对已知数量范围的数组进行排序。...
  • gaoruxue918
  • gaoruxue918
  • 2017年03月12日 00:06
  • 687

计数排序及其C++实现

计数排序 COUNTING_SORT计数排序假设n个输入元素中每一个都是在0到k区间内的一个整数。其中k为某个整数。当k=O(n)时,排序的运行时间为Θ(n).计数排序的基本思想是:对每一个输入元素x...
  • u010525694
  • u010525694
  • 2017年05月30日 21:56
  • 381

计数排序C语言实现

计数排序是稳定排序,而且是线性时间内的排序算法,时间复杂度是O(n + k)其中k是待排序数组的范围。计数排序不是原址排序,空间复杂度是O(n + k) //k是指A中的数组范围是0...
  • XianBT
  • XianBT
  • 2015年08月04日 00:12
  • 825

【算法导论】c++实现计数排序

计数排序的基本思想为:对每一个输入的元素x,确定出小于x的元素的个数。有了这一信息,那么就可以把x直接放到相应的位置上。 特点: 1 需要临时的存储空间,如果排序数据范围特别大时,空间开销很大。 ...
  • Harry_lyc
  • Harry_lyc
  • 2012年07月06日 15:23
  • 2275

经典算法之计数排序

一 引言 计数排序假设n个输入元素中的每一个都是介于0-k的整数,此处k为某个整数。当k等于O(n)时,计数排序的运行时间为Θ(n)。 二 基本思想 计数排序的基本思想就是对每一个输...
  • SunnyYoona
  • SunnyYoona
  • 2014年04月26日 19:18
  • 2949

排序算法之 计数排序 及其时间复杂度和空间复杂度

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015年03月23日 11:44
  • 3393

可以进行原地排序的计数排序

如题,算法导论上给出的计数排序需要额外申请O(n)的空间来存储排好序的结果。 在算法导论(第二版)8-2思考题中,提出能否只需要O(k)的空间复杂度,对计数排序进行修改,实现原地排序。 下...
  • Will_Lee_Buaa
  • Will_Lee_Buaa
  • 2013年11月27日 13:40
  • 1301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法之计数排序
举报原因:
原因补充:

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