桶排序

Posted 无惧风云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桶排序相关的知识,希望对你有一定的参考价值。

桶排序 (Bucket sort)将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。

桶排序最好情况下使用线性时间O(n),很显然桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为 其它部分的时间复杂度都为O(n);很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

#include <iostream>
using namespace std;
int a[] = { 1, 255, 36, 32, 23, 16 };
const int len = sizeof(a) / sizeof(int);
int b[10][len + 1] = { 0 };
void bucketsort(int a[]);
void distributeelements(int a[], int b[10][len + 1], int digits);
void collectelements(int a[], int b[10][len + 1]);
int numofdigits(int a[]);
void zeroBucket(int b[10][len + 1]);
int main()
{
	cout << "原始数组:";
	for (int i = 0; i < len; i++)
	{
		cout << a[i]<<" ";
	}
	cout << endl;
	bucketsort(a);
	cout << "排序后数组:";
	for (int i = 0; i < len; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}
void bucketsort(int a[])
{
	int digits = numofdigits(a);
	//cout << digits << endl;
	for (int i = 1; i <= digits; i++)
	{ 
		distributeelements(a, b, i);
		collectelements(a, b);
		if (i != digits)
			zeroBucket(b);
	}
}
int numofdigits(int a[])
{
	int largest = 0;
	for (int i = 0; i < len; i++)
		if (a[i]>largest)
			largest = a[i];
		int digits = 0;
		while (largest)
		{
			digits++;
			largest /= 10;
		}
	
	return digits;
}
void distributeelements(int a[], int b[10][len + 1], int digits)
{
	int divisor = 10;
	for (int i = 1; i < digits; i++)
		divisor *= 10;
	for (int j = 0; j < len; j++)
	{
		int numofdigits = (a[j] % divisor - a[j] % (divisor / 10)) / (divisor / 10);
		int num = ++b[numofdigits][0];
		b[numofdigits][num] = a[j];
	}
}
void collectelements(int a[], int b[10][len + 1])
{
	int k = 0;
	for (int i = 0; i < 10; i++)
		for (int j = 1; j <= b[i][0]; j++)
			a[k++] = b[i][j];
}
void zeroBucket(int b[][len + 1])
{
	for (int i = 0; i < 10;i++)
	for (int j = 0; j < len + 1; j++)
		b[i][j] = 0;
}

  参考:百度百科(桶排序)

以上是关于桶排序的主要内容,如果未能解决你的问题,请参考以下文章

桶排序代码

桶排序和计数排序

线性排序:桶排序计数排序

线性排序:桶排序计数排序

排序算法——桶排序

python桶排序代码