排序原理
假设现在要对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