排序算法之计数排序

原创 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;  
}  
 

            运行结果:

            

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

相关文章推荐

计数排序算法实例

  • 2012年11月29日 09:42
  • 574KB
  • 下载

计数排序算法(C语言实现)

计数排序,  比较适合数值跨度比较小的,  也就是数组中最大值减去最小值得到的值尽量小,  同时数组元素又比较多的情况下用计数排序效率比较高,同时,计数排序算法基友稳定性。 计数排序的时间复杂度为O...

计数排序算法详解

经典排序算法 - 计数排序Counting sort 注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 ...

计数排序算法(c语言测试)(稳定版本)

#include /*计数排序 一个稳定不需要比较 效率为线性的算法 基本原理:: 通过借助临时数组的下标来记录 需要排序数组中值排序后 的正确位置 ...
  • andan14
  • andan14
  • 2013年06月26日 12:10
  • 358

计数排序算法

上篇文章介绍了:生成一定范围内的互不相等随机整数的一种算法。并将生成的结果存入了一个文件,现在我们要把这些数按从小到大排序后,重新放入一个文件。         这个问题应该怎么解决呢?     ...

C++ 计数排序算法的实现与改进(含笔试面试题)

计数排序局限性比较大,算法思想:假定输入是有一个小范围内的整数构成的(比如年龄等),利用额外的数组去记录元素应该排列的位置,思想比较简单。 计数排序是典型的不是基于比较的排序算法,基于比较的排序算法...

计数排序算法实现(函数模板)

/* *功能描述: 计数法排序 * 参数说明: min~max:输入整数的范围(包括边界) * n:输入数据的个数 */ #include using namespace std; ...
  • twlkyao
  • twlkyao
  • 2013年03月31日 19:04
  • 754

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

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

C++排序算法之计数排序

计数排序 像快排、堆排、归并等排序算法都是基于比较的排序算法,时间复杂度最好情况也只能降到O(nlogn)。 计数排序是一种线性排序算法,不需要进行比较,时间复杂度为O(n)。(注意是计数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法之计数排序
举报原因:
原因补充:

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