桶排序--小试牛刀

桶排序特点:

在桶的大小和元素个数呈现线性关系的时候,复杂度是线性的,最差是O(n^2)(个人理解是当所有元素都在一个桶的时候,采用插入排序的时候);

稳定排序(注意实现的时候:对同一个桶内元素的排序要使用稳定排序实现);

空间复杂度比较高;

桶排序的描述:

(1)初始化桶,将元素放入到合适的桶内

(2)对各个桶内的元素进行排序(插入排序)

(3)输出元素

具体流程就不介绍了,以下是个人的实现,主要分存在重复和不存在重复两种情况,我的代码只是测试,另外排序不是用的插入排序


 1 #include <iostream>
2 #include <queue>
3 #include <climits>
4 #include <algorithm>
5 #include <memory.h>
6 #include <stdio.h>
7 #include <ostream>
8 #include <vector>
9 #include <list>
10
11 using namespace std;
12
13 vector<int> data;
14 int maxNum = 99;
15 void bucket_sort_unique()
16 {
17 int *bucket = new int[100];
18 memset(bucket,-1,sizeof(bucket));
19 vector<int>::iterator it;
20 for(it = data.begin() ; it!=data.end() ; ++it)
21 {
22 bucket[*it] = *it;
23 }
24 for(int i = 0 ; i<100 ; ++i)
25 {
26 if(bucket[i] > 0)
27 cout<<" "<<bucket[i];
28 }
29 }
30
31 void bucket_sort()
32 {
33 vector<list<int> > bucket(100);
34 vector<int>::iterator it;
35 it = data.begin();
36 while(it != data.end())
37 {
38 bucket[*it].push_back(*it);
39 ++it;
40 }
41 for(int i = 0 ; i<100 ; ++i)
42 {
43 if(bucket[i].size() != 0)
44 {
45 bucket[i].sort();
46 list<int>::iterator it1 = bucket[i].begin();
47 while(it1 != bucket[i].end())
48 {
49 cout<<" "<<*it1;
50 it1++;
51 }
52 }
53 }
54 }
55
56 int main()
57 {
58 int n;
59 cin>>n;
60 while(n--)
61 {
62 int tmp;
63 cin>>tmp;
64 data.push_back(tmp);
65 }
66 //bucket_sort_unique();
67 bucket_sort();
68 return 0;
69 }

时间: 2024-10-13 23:23:29

桶排序--小试牛刀的相关文章

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

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有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],存放临时结果的