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程序执行的过程如下图所示:
8-2.计数排序

8-2.计数排序

8-2.计数排序

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

你可能感兴趣的:(排序)