ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-04 19:05:03  阅读:132  来源: 互联网

标签:10 arr int 元素 bucket ++ 计数 思考 排序


#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]);
}

 

标签:10,arr,int,元素,bucket,++,计数,思考,排序
来源: https://www.cnblogs.com/AnOneBlog/p/14231609.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有