C语言学习之桶排序

  之前的博文写了交换(冒泡)排序、选择排序,本文就写写桶排序。不过我理解的这样不算是真正上的桶排序,我的比较简单而真正的桶排序是比较复杂的,暂且就叫桶排序吧。

  桶排序在排序中应该用的不多吧,个人理解的是比较简单易懂的,针对小量数据的排序很有用,不过有个小缺点就是只适合在屏幕上打印输出,实际的应用中我们是利用这样排列好之后的数据,我想这就是桶排序应用场合比较少的原因吧。

  就简单讲讲吧,故名思意 桶排序就是一排带有序列编号的的桶子,而这编号的范围就是将我们要排序数据包括在内。在我们输入数据的时会在与输入数据相同编号的桶上标记一次,每次输入数据都在与数据相同编号的桶上标记一次,这样每个数据出现的次数就显而易见了,同时排序也好了,我们按照编号顺序依次把没有标记的桶子排除,再根据桶子标记的次数打印等量次数就行了。

#include"stdio.h"
int main(void)
{
    int i, j;
    int n, b[10] = {};//首先将所有桶的标记都重置为 0
    for(j = 0; j < 10; j ++)
    {
        scanf("%d", &n);//依次读入10个数据
        b[n] ++;
    }
    for(i = 0; i < 10; i ++)
            for(j = 0; j < b[i]; j ++)//根据次数打印数据                    //没有标记的为0那么就不会打印出来
            printf("%d ", i);
}

  当然这里以10以内的数据为例 如输入 4 4 5 6 1 0 4 4 6 8 输出结果为 0 1 4 4 4 4 5 6 6 8

  在运用就自行调整数据范围,更改数组的大小、更改for的范围使之刚好可以把最值包含在内,这样至少可以省点时间。

#include"stdio.h"
//排序四位数
int main(void)
{
    int i, j;
    int n, b[10000] = {};//调整数组大小
    for(j = 0; j < 10; j ++)
    {
        scanf("%d", &n);//依次读入10个数据
        b[n] ++;
    }
    for(i = 1000; i < 10000; i ++)//调整范围
            for(j = 0; j < b[i]; j ++)
            printf("%d ", i);
}

  如上修改了一下 就可以用来排序四位数 输入数据 3234 6535 8743 9876 4567 5466 5434 2345 8798 4323 输入结果为 2345 3234 4323 4567 5434 5466 6535 8743 8798 9876

  实际运用就实际修改咯 我个人理解的桶排序是很简单的 但真正的桶排序是有点复杂的 笔者只是了解下 如要深入还需自行百度 Google 哈

原文地址:https://www.cnblogs.com/notfound/p/8407171.html

时间: 2024-10-14 13:02:22

C语言学习之桶排序的相关文章

【ES】学习11-多桶排序

聚合结果的排序 默认:桶会根据 doc_count 降序排列. 内置排序: 设置按doc_count升序排序:注意order,_count GET /cars/transactions/_search { "size" : 0, "aggs" : { "colors" : { "terms" : { "field" : "color", "order": { &quo

c语言学习之结构篇代码演示样例-输入n个同学的姓名,数学英语成绩,依照平均分从低到高排序并输出

#include<stdio.h> void main(){ const int count = 5;//定义数量 struct student{ char name[80]; float math,eng; float aver; }stu[count],temp; //输入 for (int i = 0; i < count; i++){ scanf("%s%f%f", stu[i].name, &stu[i].math, &stu[i].eng)

c语言学习之结构篇代码示例-输入n个同学的姓名,数学英语成绩,按照平均分从低到高排序并输出

在虚拟机上测评了下MySQL 和 PostgreSQL 的各种LOAD FILE方式以及时间. 因为是虚拟机上的测评,所以时间只做参考,不要太较真, 看看就好了.MySQL 工具:    1. 自带mysqlimport工具.    2. 命令行 load data infile ...    3. 利用mysql-connector-python Driver来写的脚本. PostgreSQL 工具:    1. pgloader 第三方工具.    2. 命令行 copy ... from

C语言学习_排序_插入排序

1.插入排序 #include <stdio.h> #include <stdlib.h> #define M 100 int main(void) { int i, j, n; int a[M] = {0}; printf("input n:"); scanf("%d", &n); printf("input a:"); for(i = 1; i <= n; i++) //从a[1]开始,也就是第二个数 s

Perl语言学习笔记 14 字符串与排序

1.字符串内用index搜索 $where = index($words,$word); ##从words里找到首次出现word的位置,下标从0开始,查找失败则返回-1: 指定开始搜索的地方:$where = index($words,$word,10); ##从10开始往后寻找,包含10 搜索子串最后出现的位置: 限定返回的最大位置:$where = rindex($words,$word,10); ##只搜索下标为10以前的字符. 2.处理子串 substr参数:依次为:字符串.起始下标.要

桶排序及C语言实现

本文内容主要参考这篇博文:http://hxraid.iteye.com/blog/647759 桶排序算法的基本原理是:把数组中的所有元素分为若干个数据块,也就是若干个桶,然后对每个桶里的数据进行排序,最后将所有桶里的数据依次排列即可. 这里就存在两个问题: (1)怎样划分数据块,也就是分几个桶,每个桶放哪几个数据. (2)对每个数据块里的数据怎样排序. 对于第一个问题:用函数映射的方法来划分.举一个很简单的例子,假设数据都为2位的正整数,那么对应的映射函数可以为f(x)=x/10.即把十位相

算法学习-02(希尔排序,计数排序,桶排序,基数排序)

希尔排序 # 希尔排序 # 希尔排序是对插入排序的升级改造 # 它的大致流程是 # 1.将长度为n的序列 分为d = n//2组 # 2.使每一组变的有序 # 3.将序列分为 d1 = d // 2 组 # 4.将每一组变的有序 # 5.直到最后 d 小于等于 0 def inster_sort_gap(li,gap): for i in range(gap,len(li)): tmp = li[i] j = i - gap while j >= 0 and tmp > li[j]: li[j

排序算法之——桶排序

这是本人的第一篇随笔,为的是分享学习经验,和大家讨论一些算法,以便取得些许进步,也是对学习的总结. 话不多说,下面我会用图文的方式向各位介绍桶排序. 1.主要思想: 桶排序的大体思路就是先将数组分到有限个桶中,再对每个桶中的数据进行排序,可以说是鸽巢排序的一种归纳结果(对每个桶中数据的排序可以是桶排序的递归,或其他算法,在桶中数据较少的时候用插入排序最为理想). 2.算法效率: 对N个数据进行桶排序的时间复杂度分为两部分: 1.对每一个数据进行映射函数的计算(映射函数确定了数据将被分到哪个桶),

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

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