计数排序C++源码

计数排序假设n个输入元素中的每个都是介于0道k之间的整数,此处k为某个整数。当k=O(n)时,基数排序的运行时间为O(n).

计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把想直接放到他最终输出数组中的位置上。

/******************************************************************/
/* the program just to show  Counting Sort                        */
/* Auther:SaoNian                                                 */
/* Time:2012/11/14                                                */
/******************************************************************/
#include <iomanip.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int * generateArray(int n,int k);//generate an unsorted array with length n  
void showArray(int *a,int n);  
void CountingSort(int *a,int n,int k);
int main()  
{  
	int n,k;
	cout<<"Please input the length of Array:";
	cin>>n;
	cout<<"Please input the of range the Number(k<=n):";
	cin>>k;
    int * arr=generateArray(n,k);  
    cout<<"the unsort Array:"<<endl;  
    showArray(arr,n);  
	CountingSort(arr,n,k);
    cout<<"now we Sort it:"<<endl;  
    showArray(arr,n);  
    return 0;  
}

void CountingSort(int *a,int n,int k)
{
	int * c=new int[k+1];
	int * b=new int[n+1];
	int i;
	for (i=0;i<=k;i++)
	{
		c[i]=0;
	}
	//记录大小为a[i]的元素的个数
	for(i=1;i<=n;i++)
	{
		c[a[i]]++;
	}
	for (i=1;i<=k;i++)
	{
		c[i]=c[i]+c[i-1];
	}
	for (int j=n;j>=1;j--)
	{
		b[c[a[j]]]=a[j];
		c[a[j]]--;
	}
	for(i=1;i<=n;i++)
		a[i]=b[i];
}
  
int * generateArray(int n,int k)  
{  
    int i;  
    int * arr=new int[n+1];  
    srand((int)time(NULL));  
    for(i=1;i<=n;i++)  
    {  
        arr[i]=rand()%k;  
    }  
    return arr;  
}  
void showArray(int *a,int n)  
{  
    int i=1;  
    for(;i<=n;i++)  
    {  
        cout<<setw(4)<<a[i];  
        if(i%10==0)  
        {  
            cout<<endl;  
        }  
    }  
}  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值