zoukankan      html  css  js  c++  java
  • 桶排序

    桶排序 (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;
    }
    

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

  • 相关阅读:
    http 学习 1-1 chapter1-HTTP概述
    2048 游戏实现原理
    safari 日期对象新建new Date( timeStr ) 参数TimeStr格式
    js
    js 常见弹出框学习
    JS引入CSS文件
    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
    java复制文件 转
    Map键值对,一种思路
    写入excel表格数据
  • 原文地址:https://www.cnblogs.com/wujufengyun/p/6736947.html
Copyright © 2011-2022 走看看