最简单的排序算法

一提到算法,大部分人的第一反应都是排序。实在是排序算法太经典了,感觉能独占算法的半壁江山。无论是算法课,还是笔试面试,排序算法都是必须掌握的基本内容。而提到算法,绝大多数人,哪怕是研究生毕业的,高学历的人才,最爱的就是“冒泡排序”,为啥啊?简单呗!冒泡排序实在是大名鼎鼎啊,就算我没接触算法和数据结构时,我都如雷贯耳,排序只知“冒泡”而不知其他。但是其实冒泡还不算最简单。现在来说一说最简单的排序:桶排序。

桶排序,一句话概括,就是“一个萝卜一个坑”。假设我们要给一组100以内的数排序,比如3,90,3,9,1,7,34... ...等等吧,瞎写一通,只要在100以内就行。那我们首先得需要100个空“桶”,编号1~100,用来存放它所对应的数的个数。好了,现在这100个空桶已经按照1到100的编号摆好位置了,并且全部初始化为0。接下来开始往里面放东西了。来一个数就把它放到它所对应的的那个编号的桶里。比如来了一个3,就把它放到3号桶里,3号桶就由0变成了1;又来了一个90,就把它放到90号桶里,90号桶由0变成了1;又来了一个3,把它放到3号桶里,3号桶由1变成了2... ...就这样把所有的数都放到桶里。

输出就简单多了,其实把所有数装完,就相当于排好序了。假设要从小到大输出,就从1号桶到100号桶依次把数取出来就行了。

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //freopen("input.txt","r",stdin);
    int a;
    int arr[101];
    memset(arr,0,sizeof(arr));//把arr数组清0
    while(scanf("%d",&a)==1)//来一个数就把它放到桶里。这里注意如果输入不用文件的话,输入结束要按ctrl+z+enter告诉系统输入结束。
        arr[a]++;

    int i,j;
    for(i=1;i<=100;i++)//循环判断arr1到arr100
        for(j=1;j<=arr[i];j++)//每个桶里有几个数就输出几次
            printf("%d ",i);

    return 0;
}

桶排序虽然简单但是有很大的限制。比如本例,只能排1到100的整数,负数和小数排不了。而且十分浪费存储空间。假设我只需要排10个数,但是里面有一个一亿,那就需要申请一亿个空间。但是优点也有,它是速度最快的排序算法,时间复杂度为O(M+N)。其中M表示桶的个数,N表示排序数的个数。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,309评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,835评论 0 15
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,385评论 0 35
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,364评论 0 2
  • (原创词作)寿山曲•人到中年/徐宏 寿山曲•人到中年 徐 宏 心轻岁不惑,儿子初长成,孝道无忧...
    sunxuhong阅读 652评论 2 5

友情链接更多精彩内容