排序算法学习:快速的桶排序

排序原理

这里写图片描述
假设现在要对5 3 5 2 8这几个数进行排序。我们申请一个大小为9的数组(待排序数中最大数+1),假设为9个木桶,把9个木桶置为0,如图:
这里写图片描述

然后在对应桶的编号(这就是为什么要设置为待排序数组中最大数+1了)中标记1,如图在a[5]中标记为1,表示待排数组中有5,并且5在a[5]这个位置。
这里写图片描述

继续向后标记

这里写图片描述

如果遇到重复的数字,比如两个5,就在该位置a[5]置为2,表示有两个5

这里写图片描述

这里写图片描述
把所有要排序的数字都在对应位置的桶中做了标记,把被标记的桶中的编号顺序取出来,就是排好的顺序,如图取出为2 3 5 5 8。

代码示例:

/*********************************************************************************
 *      Copyright:  (C) 2017 fanmaolin<fanmaolinn@gmail.com>
 *                  All rights reserved.
 *
 *       Filename:  bucketsort.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(08/05/2017)
 *         Author:  fanmaolin <fanmaolinn@gmail.com>
 *      ChangeLog:  1, Release initial version on "08/05/2017 08:55:48 PM"
 *                 
 ********************************************************************************/

#include <stdio.h>

int i;
int j;

void bucketsort(int A[],int a[], int n)
{
    int *p;//定义一个指针,指向木桶数组
    p = a;

    for(i = 0;i < n;i++)//对桶中对应数组进行1的标记
    {
        p[A[i]]++;
    }
    printf("打印木桶a[]的标号:");

    for(i = 0; i <= 8; i++)
    {
        printf("%d ", p[i]);
    }


    for(i = 0, j = 0;i <= 8;i++)//进行桶排序
    {
        while((p[i]--) > 0)//如果有标记,标记几次就打印几次
        {
            A[j++] = i;  //把桶中对应的数赋值给对应的A[]中
        }
    }

 bucketsort.c                                                                                                                       
}

int main()
{
    int A[] = {3, 0, 8, 2, 1, 5};   //要进行排序的数字
    int a[9];      //创建一个排序数组中最大数+1大小的数组,比如现在要排序数组中最大数为8,就要创建一个max+1的数组
    int n = sizeof(A)/sizeof(int);
    for(i = 0; i < 9; i++ )//对木桶赋0值
    {
        a[i] = 0;
    }

    for(i = 0; i < n; i++)//打印未排序数组
    {
        printf("%d ", A[i]);
    }
    printf("\n");

    bucketsort(A, a, n);//进行桶排序
    printf("\n");

    printf("打印桶排序结果:");
    for(i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
    }
    printf("\n");

}

结果:

[fanmaolin@Centeros paixu]$ gcc bucketsort.c          
[fanmaolin@Centeros paixu]$ ./a.out 
3 0 8 2 1 5 
打印木桶a[]的标号:1 1 1 1 0 1 0 0 1 
打印桶排序结果:0 1 2 3 5 8 

排序特点

优点:速度快,简单
缺点:占空间大,如果你要排的数字中有1000,你就要申请1001大小的数组。

总结:

1、算法重在理解,多看资料。

2、错误:

[fanmaolin@Centeros paixu] gccbucketsort.c[fanmaolin@Centerospaixu] ./a.out
3 0 8 2 1 32766
打印木桶a[]的标号:1 1 1 1 0 0 0 0 1
打印桶排序结果:0 1 2 3 8 32766

多打印了32766,这并不是我需要的数

原因:
for(i = 0; i <= n; i++)//多打印了一位,而那一位我们并没有赋值,是个垃圾数据
64 {
65 printf(“%d “, A[i]);
66 }

改为:for(i = 0; i < n; i++)

注意我的程序中用指针p指向木桶数组,标记它的位置,在这里不用指针会出错,反复打印

参考链接:
http://www.cnblogs.com/skywang12345/p/3602737.html
http://ahalei.blog.51cto.com/4767671/1362789解释清晰
http://blog.csdn.net/linwh8/article/details/50320249?locationNum=14&fps=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值