什么是桶排序?

桶排序也是分配排序的一种,但其是基于比较排序的,这也是与基数排序最大的区别所在。

思想:桶排序算法想法类似于散列表。首先要假设待排序的元素输入符合某种均匀分布,例如数据均匀分布在[ 0,1)区间上,则可将此区间划分为10个小区间,称为桶,对散布到同一个桶中的元素再排序。

要求:待排序数长度一致。

排序过程: 
(1)设置一个定量的数组当作空桶子; 
(2)寻访序列,并且把记录一个一个放到对应的桶子去; 
(3)对每个不是空的桶子进行排序。 
(4)从不是空的桶子里把项目再放回原来的序列中。

什么是桶排序?_第1张图片

#include 
#include 
using namespace std;

void bucketSort(int data[], int len)
{
    //find minx max value of the array data
    int min = data[0];
    int max = min;
    for(int i = 1; i < len; i++)
    {
        if(data[i] < min)
            min = data[i];

        if(data[i] > max)
            max = data[i];
    }

    //get the bucket counts;
    int bucketCounts = (max-min)/len + 1;

    vector> bucketArrays;
    for(int i = 0; i < bucketCounts; i++)
    {
        //position 0 used to keep the data count store in this bucket
        vector bucket;
        bucketArrays.push_back(bucket);
    }

    //assign each value to bucket arrays.
    for(int j = 0; j < len; j++)
    {
        int num = (data[j]-min)/len;
        bucketArrays[num].push_back(data[j]);
    }

    //sort each bucket
    for(int i = 0; i < bucketCounts; i++)
    {
        std::sort(bucketArrays[i].begin(), bucketArrays[i].end());
    }

    int index = 0;
    //collect value from radix arrays to data
    for(int k = 0; k < bucketCounts; k++)
    {
        for(int s = 0; s < bucketArrays[k].size(); s++)
        {
            data[index++] = bucketArrays[k][s];
        }
    }
}

int main() {

    int arr[10] = {18,11,28,45,23,50};
    bucketSort(arr, 6);

    for(int i = 0; i < 6; i++)
        cout << arr[i] << endl;

    return 0;
}

 

你可能感兴趣的:(数据结构)