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

来源:互联网 发布:ubuntu skype安装包 编辑:程序博客网 时间:2024/06/05 06:02

排序原理

这里写图片描述
假设现在要对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

原创粉丝点击