8-2.计数排序

计数排序的基本思想是:统计一个数序列中小于某个元素a的个数为n,则直接把该元素a放到第n+1个位置上。当然当过有几个元素相同时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数

// 8-2.计数排序.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void CountSort(int a[],int b[],int array_size,int k)
{
	int* c=new int[k+1];
	for (int i=0;i<=k;i++)
	{
		c[i]=0;
	}
	//c[i] contains the number of elements equal to i
	for (int i=0;i<array_size;i++)
	{
		c[a[i]]++;
	}
	//c[i] contains the number of elements less than or equal to i
	for (int i=1;i<=k;i++)
	{
		c[i]=c[i]+c[i-1];
	}
	//confirm the num position
	for (int i=array_size-1;i>=0;i--)
	{
		b[c[a[i]]-1]=a[i];
		c[a[i]]--;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[8]={2,5,3,0,2,3,0,3};
	int b[8];
	CountSort(a,b,8,5);
	for (int i=0;i<8;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
	return 0;
}

对于数据2 5 3 0 2 3 0 3程序执行的过程如下图所示:

现在有个问题,若必须是0到n的自然数,是不是用途很小?我想了想,其实可以任意整数的,即找出最小的数来,看看与0的距离d,把所有的数同时减去d,划到0到n的范围内,计数排序。到最后待恢复就可以了。

posted @ 2015-07-16 23:13  程序员修练之路  阅读(261)  评论(0编辑  收藏  举报