计数排序、桶排序实现及思考

#include <iostream>
#include "iomanip"
#include "vector"
#include "algorithm"
#define m 10000

using namespace std;

/*
计数排序:
在每个元素取值范围的情况下(eg[0 - M]),开设cout[0] - cout[M]
用cout数组的每个元素代表的是a数组中元素数值为i的元素个数。由此对
a[]数组进行排序。
*/
void countSort(int a[] , int n)
{
    int c[m+1];
    for(int i = 0 ; i <= m ; i++) c[i] = 0;
    for(int i = 0 ; i < n ; i++) c[a[i]]++;
    //用数组c存放值为a[i]的元素个数
    //c[i]代表元素值为i的个数,j代表a的排序位置
    for(int i = 0 , j = 0 ; i < m+1 ; i++)
    {
        while(c[i]!=0)
        {
            a[j++] = i; c[i]--;
        }
    }

}

/*
桶排序:
在基于上述计数排序的情况下,缩小桶的个数
(因为数据在某些情况下离散程度比较高。eg,100笔 m是数值10000有2笔
而最小的是99999有98笔,那么就要开设10000个空间,造成浪费。)
由此,我们根据数据的情况进行划分每个桶的装填大小范围,减少桶的个数。
*/
void BucketSort(int arr[], int n)
{
    int max = arr[0];
    //找a表中元素的最大值
    for (int i = 1; i < n; i++)
    {
        if (arr[i] > max)
            max = arr[i];
    }
    //按照元素的最大值进行分配桶的个数
    vector<int> *bucket = new vector<int>[max / 10 + 1];
    //把所有元素装进对应的桶
    for (int i = 0; i < n; i++)
    {
        int change = arr[i] / 10; //元素arr[i]所在的桶编号
        bucket[change].push_back(arr[i]);
    }

    //对桶的元素排序
    for (int i = 0; i < max / 10 + 1; i++)
    {
        if (bucket[i].size() > 0)
        {
            sort(bucket[i].begin(), bucket[i].end()); //桶内排序
        }
    }
    int index = 0;
    for (int i = 0; i < max / 10 + 1; i++) //桶遍历
    {
        for (int j = 0; j < bucket[i].size(); j++) //遍历桶内元素
        {
            arr[index++] = bucket[i][j];
        }
    }
}

int main()
{
    int a[10] = {1,9,2,0,12,4,5,3,7,10};
    BucketSort(a , 10);
    for(int i = 0 ; i < 10 ; i++)
        printf("%d ",a[i]);
}

 

上一篇:Open vSwitch---流表控制主机数据转发实验(五)---group表实践


下一篇:十大经典排序算法(八、计数排序)