桶排序(做题感悟)

发布于 2016-02-21  559 次阅读


关于桶排序的文章,我几乎是没有见过。见过也看不懂===所以只好学会以后自己写一个了。

桶排序特点:

1,桶排序是稳定的

2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下

3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法

 

桶排序与其他排序的比较:

基数排序,与选择,冒泡,插入排序不同的是,前者都属于【比较性】排序,而基数排序是【分配式】排序,所以他又称”桶排“;

桶排,顾名思义,就是透过数据的部分资讯,将待排序的元素分配至某些【桶】中,从而达到排序的作用,他属于稳定性的排序。

下面用【栗子】来讲吧:

Codevs1487 大批整数排序

题目描述 Description

!!!CodeVS开发者有话说:

codevs自从换了评测机,新评测机的内存计算机制发生变化

计算内存的时候会包括栈空间 swap空间

这题的2M是单指内存空间。。。

十分十分抱歉

抱歉

!!!

 

现在有一大批(总数不超过10000000个)1到10之间的整数,现在请你从小到大进行排序输出。

(测试数据将超过11MB。)

输入描述 Input Description

第一行表示将下排序的个数N;

第2行到最后一行,每行一个数,表示有待排序的数(均是1-10之间的数,含1和10)

(注:最后有一空行)

输出描述 Output Description

输出N个从小到大排列好的数,每行一个(注:最后有一空行)

样例输入 Sample Input

11
9
10
1
2
3
4
5
6
7
8
9

 

样例输出 Sample Output

1
2
3
4
5
6
7
8
9
9
10

 

分析:根据题目不难想起解题方法。肯定是排序之后又是什么排序。我最先想到的是STL的sort。之后试了一下。

aaa

出现了这个结果。第二个数据点没有过。之后我重新审了一下题目现在有一大批(总数不超过10000000个)110之间的整数】很明显。SORT承受不了这么多组数。受不了受不了受不了,这日子没发过了啊。怎么办……

 

之后呢,聪明的古人发明了快速简洁的排序——桶排序(没找到发明人和日期。)

 

对此题目有了其他解法。(桶排序似乎出现早

#include <cstdio>

#include <iostream>

using namespace std;

int n,a[11],x;

int main()

{

   menset(a,0,sizeof(a));

    scanf("%d",&n);

    for(int i=1;i<=n;i++)

    {

        scanf("%d",&x);

        a[x]++;

    }

    for(int i=1;i<=10;i++)

    if(a[i]!=0)

    {

        for(int j=1;j<=a[i];j++)

        printf("%d\n",i);

    }

    return 0;

}

首先n为输出N个从小到大排列好的数。之后就进入了核心代码。【110之间的整数】这一个条件,就可以得到需要10个【桶】就OK。在学数组的时候学过,需要把数组开大一点。【桶】也要大一点。就开十一个。下面就考虑桶的表示。等等==刚刚说了什么数组?

嗯?数组=桶。

for(int i=1;i<=n;i++)

    {

        scanf("%d",&x);

        a[x]++;

    }

 

 

就将其分为11个桶(一个桶备用)。X为1~10的数。也为每输入一个数就判断在哪一个桶里并放入。桶内数量+1.这段代码应该不难理解。看下一段。

for(int i=1;i<=10;i++)

    if(a[i]!=0)

    {

        for(int j=1;j<=a[i];j++)

        printf("%d\n",i);

    }

 

 

判断并输出。首先遍历10个桶。之后判断桶内数量是否为0.如果0下一个,如果不是0,是几就输出几。

好哒,桶排就这么简单,下次再见


等风来,不如追风去。