排序算法学习:快速的桶排序
来源:互联网 发布: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]
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
- 排序算法学习:快速的桶排序
- 排序算法学习- 快速排序
- 排序算法学习:快速排序
- 算法学习,快速排序
- 算法学习--快速排序
- 算法学习:快速排序
- 算法学习---快速排序
- 快速排序算法学习
- 快速排序算法学习
- 桶排序、冒泡排序、快速排序 -- 算法学习 小结篇
- 算法学习之排序算法:快速排序
- 【算法学习】排序算法-快速排序
- 算法学习之排序:快速排序算法
- 排序算法学习之快速排序算法
- 经典算法学习:排序之快速排序
- 算法学习之排序(5)--快速排序
- 排序算法学习——快速排序
- 算法系统学习-1排序-快速排序
- eclipse 安装python后pydev不出现
- bzoj4596&&JZOJ5271&&5043保持平衡 贪心+堆(经典思想)
- maven 教程
- spring boot 异常处理全局拦截
- 机房收费系统的准备工作
- 排序算法学习:快速的桶排序
- Linux学习笔记:vim编辑器
- 使用深卷积神经网络的高光谱图像的光谱空间分类
- scrapy框架学习-实现一个简单的爬虫程序
- 数组元素全部初始化为同一值问题
- Dungeon Master POJ
- RNN循环神经网络代码实例
- java入门首先了解的问题 (二)
- Android系统Intent中的Uri使用