9.桶排序

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn = 100 + 2;
int num[maxn], n;

struct node
{
    node(){ next = NULL; num = -1; }
    node(int x, node *n):num(x), next(n) {}
    int num;
    node *next;
};

int bits(int x)
{
    int ret = 0;

    while(x >= 10)
    { ret++; x /= 10; }

    return ret + 1;
}

void Insert(node *n, int x)
{
    node *p = n;
    if(p->next == NULL)
    {
        p->next = new node(x, NULL);
        return ;
    }

    for(; p->next != NULL; p = p->next)
    {
        if(p->next->num > x)
        {
            p->next = new node(x, p->next);
            return ;
        }
    }
    p->next = new node(x, NULL);
}

void Bucket_sort(int *num, int n, int k)
{
    node *c = new node[10];

    for(int i = 0; i < n; i++)
        Insert(&c[num[i] / k], num[i]);

    int t = 0;
    for(int i = 0; i < 10; i++)
        for(node *p = c[i].next; p != NULL; p = p->next)
            num[t++] = p->num;
}

int main()
{
    cin >> n;
    int *k = &num[0];
    for(int i = 0; i < n; i++)
    {
        cin >> num[i];
        if(*k < num[i]) k = &num[i];
    }
    Bucket_sort(num, n, pow(10, bits(*k) - 1));

    for(int i = 1; i < n; i++)
        cout << num[i] << " ";
    cout << endl;
}

时间复杂度为O(n) ~ O(n^2), 嗯, 比较随缘的一种算法

我的这个版本只能排序正数,对数据分布均匀的情况比较适用

代码没有快排来的简洁, 只是学习用吧....

再有就当作练习链表了....

时间: 2024-10-11 11:50:10

9.桶排序的相关文章

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

桶排序

假设现在有一组小于M的正整数 a1. a2 ,-- ,an ,对它们排序可以采用以下的思路:使用一个大小为M的数组buckets,这个数组的每一个单元称为一个个的bucket,桶,初始化全部为0.扫描数组a,当扫描到ai的时候,buckets[ai] 加1.这样当a扫描完之后,扫描buckets,打印非零单元的下标,它的值是几就打印几次.打印出来的值实际上就是排好序之后的数组a了.我们可以依次把它们赋值给a,使得a有序. 代码如下: #include<iostream> using names

基数排序(桶排序) 不同方法

详细解释:算法导论/数据结构书 1.链式基数排序 //n个数,每个数有g个关键字//排序:从最后的关键字开始到最前的关键字//分配+收集//每个关键字分配+收集需要n+n时间,而共有g个关键字,时间复杂度为O(2ng),效率很高.//如果用数组,数据集中在一个区间,则区间的长度很长,另外的区间的内存浪费了.//用链表可以解决这个问题,且数据不需要先后顺序,所以无必要非要用数组 1 #include <stdio.h> 2 #include <stdlib.h> 3 //个数 4 #

重复造轮子系列--桶排序

理解了基数排序,也就理解了桶排序. 桶排序就是基数排序的一种优化,从MSD开始,即取最高位来排一次序,如果最高位没有重复(意味着没有冲突需要处理),是算法的最佳状态,O(n). 如果有冲突,就将冲突的元素存放到对应的桶里(代码就是一个链表或者数组或者stl容器),然后对每个桶进行一次插入排序,平均情况的话冲突很小的,桶里的元素的数量就不多,速度很快, 如果冲突集中在几个桶甚至一个桶里,那么就出现了算法的最差情形,也就是O(n^2)的复杂度. 下面是例子代码实现: 1 template<typen

桶排序总结

数据结构排序算法之——桶排序(Bucket sort) 插入排序想关链接: 维基百科:https://zh.wikipedia.org/wiki/%E6%A1%B6%E6%8E%92%E5%BA%8F 极客学院想关介绍:http://wiki.jikexueyuan.com/project/easy-learn-algorithm/bucket-sort.html 桶排序主要用于有大量重复数据和明确知道数据边界的情况下,进行统计的排序 基本的算法思想是: 假设数据的边界的长度为arrayLen,

最快最简单的排序算法:桶排序

在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东西都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎考的真是惨不忍睹(满分是10分).接下来将分数进行从大到小排序,排序后是8

排序算法(一)-桶排序

桶排序,顾名思义,为要拍排序数组分配一些的”桶“来排序,什么意思呢?假如你有一个数组,其中包含10个元素,其中最大的数字是90,你就分配个90个以上的桶(假如定义一个int a[101]),你可以看到,10个数定义一个含100个元素的数组用来排序(当然,a[100]随便啦,你定义int a[100],a[193]都可以,只要这个元素的个数多于要排序数组的最大数,这都是你估计的,所以你尽量数组往大里面定义,原因你看排序过程即可),很费空间,但是很省时间.下面说一个排序过程. 假如你第一个数字是3,

基数排序/桶排序-单链表实现

今天下午编程实现了基数排序(桶排序),只能说一千个人有一千个哈姆雷特,因此,一千个人可能有一千种基数排序的实现方式,无论是用数组,栈,队列,单链表(都是线性表哦, 好巧,哈哈).重要的是理解该排序算法的思路后,自己也就可以尝试着慢慢写出来了.时间关系,暂且只给出跟人代码(面试黄金月),以后有机会再补充实现思路.新手出道,代码可读性不要期望太高,多包涵,相信以后自己会进步的. typedef struct listnode // 定义节点 { int data; struct listnode *

三种线性排序算法(计数、基数、桶排序)的简单实现

一.计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 基本思想: 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将x直接放置在它在最终输出数组中的位置上. 如下图所示: 由于数组中可能有相等的数,在处理时需要注意. 时间复杂度和空间复杂度分析 算法总时间Θ(k + n).当k=O(n)时,计数排序的运行时间是Θ(n). 空间复杂度是O(n+k).需要两个辅助数组:存放排序结果的数组B[n],存放临时结果的

Java实现桶排序

详细讲解见<算法导论>8.4节--桶排序. Java代码如下: package linetimesort; import java.util.LinkedList; import sort.InsertSort; /** * 桶排序假设输入元素均匀而独立的分布在区间[0,1)上: * 桶排序的核心思想是,将[0,1)分为n个大小相同的子区间, * 上一个区间里的元素都比下一个区间里的元素小,然后对 * 所有区间里的元素排序,最后顺序输出所有区间里的元素, * 达到对所有元素排序的目的. * @