算法(4)计数排序

        计数排序不需要进行比较(//说实话,看到这句话的时候,我也是挺懵的,不比较怎么进行排序啊!),所以计数排序是有一定限制的。首先,计数排序必须是整数,范围为[0,max](//个人觉得这里的max其实也隐含了一个比较的过程)。想法是这样的,数组中的元素按大小排前面有几个,就把该元素放在新数组相应的位置。

        计数排序的操作是这样的:

        已知原数组的大小和最大的数,比如,最大的数是12。

        然后建立一个计数数组,初始化元素为0,其大小为原数组的最大的数,比如说 int count[12]。然后,对原数组中的数进行统计,如果原数组中有这个元素就在计数数组中+1,比如原数组中有2,  4,4,5,  5,  5,那么count[2]=1,count[4]=2,count[5]=3。

        下一步,求和,count[i]=count[i]+count[i-1],遍历后,count数组中元素表示原数组中<=i 的元素的个数。

        最后一步,将元素放入新数组中相应的位置,根据count数组。

        废话不说,上代码://需要注意的是,sorted[count[original[i]]-1]=orignal[i] ,这里需要-1,比如说original[0]=0且只有一个,那么count[0]=1,但是在新数组中还是要放在sorted[0]的位置,就是说差一个。 

  

#include <iostream>

using namespace std;

void showArray(int *a,int len)
{
	cout<<endl;
	for(int i=0;i<len;i++)
	cout<<a[i]<<"	";
	cout<<endl;
}

int findMax(int *a,int len)
{
	int max=a[0];
	for(int i=0;i<len;i++)
	{
		if(a[i]>max)
			max=a[i];
	}
	
	return max;
}

void countingSort(int *original,int *sorted,int len,int max)
{
	int count[max+1];
	for(int i=0;i<max+1;i++)
		count[i]=0;  //initalized array count
	
	for(int j=0;j<len;j++)
		count[original[j]]++; //count origianl array
	
	for(int i=1;i<max+1;i++)
		count[i]=count[i]+count[i-1]; //sum 
	
	for(int i=len-1;i>=0;i--)
	{
		sorted[count[original[i]]-1]=original[i];
		count[original[i]]--;
	}
}



int main()
{
	int a[]={7,9,2,12,6,9,1,4},b[8];
	showArray(a,8);
	countingSort(a,b,8,findMax(a,8));
	showArray(b,8);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值