算法练习(二)
来源:互联网 发布:软件开发认证证书 编辑:程序博客网 时间:2024/05/17 11:57
桶排序:
桶排序是另外一种以O(n)或者接近O(n)的复杂度排序的算法. 它假设输入的待排序元素是等可能的落在等间隔的值区间内.一个长度为N的数组使用桶排序, 需要长度为N的辅助数组. 等间隔的区间称为桶, 每个桶内落在该区间的元素. 桶排序是基数排序的一种归纳结果。
算法的主要思想: 待排序数组A[1…n]内的元素是随机分布在[0,1)区间内的的浮点数.辅助排序数组B[0….n-1]的每一个元素都连接一个链表. 将A内每个元素乘以N(数组规模)取底,并以此为索引插入(插入排序)数组B的对应位置的连表中. 最后将所有的链表依次连接起来就是排序结果.
这个过程可以简单的分步如下:
设置一个定量的数组当作空桶子。
寻访序列,并且把项目一个一个放到对应的桶子去。
对每个不是空的桶子进行排序。
从不是空的桶子里把项目再放回原来的序列中。
例如要对大小为[1..1000]范围内的n个整数A[1..n]排序,可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[1..10]的整数,集合B[2]存储(10..20]的整数,……集合B[i]存储((i-1)*10, i*10]的整数,i = 1,2,..100。总共有100个桶。然后对A[1..n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。 然后再对这100个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任何排序法都可以。最后依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这样就得到所有数字排好序的一个序列了。
#include <stdio.h> int main() { int a[11],i,j,t; for(i=0;i<=10;i++) a[i]=0; //初始化为0 for(i=1;i<=5;i++) //循环读入5个数 { scanf("%d",&t); //把每一个数读到变量t中 a[t]++; //进行计数 } for(i=0;i<=10;i++) //依次判断a[0]~a[10] for(j=1;j<=a[i];j++) //出现了几次就打印几次 printf("%d ",i); getchar();getchar(); //这里的getchar();用来暂停程序,以便查看程序输出的内容 //也可以用system("pause");等来代替 return 0; }
#include<stdio.h>#define Max_len 10 //数组元素个数void Show(int arr[], int n){ int i; for ( i=0; i<n; i++ ) printf("%d ", arr[i]); printf("\n");}//获得未排序数组中最大的一个元素值int GetMaxVal(int* arr, int len){ int maxVal = arr[0]; //假设最大为arr[0] for(int i = 1; i < len; i++) //遍历比较,找到大的就赋值给maxVal { if(arr[i] > maxVal) maxVal = arr[i]; } return maxVal; //返回最大值}//桶排序 参数:数组及其长度void BucketSort(int* arr , int len){ int tmpArrLen = GetMaxVal(arr , len) + 1; int tmpArr[tmpArrLen]; //获得空桶大小 int i, j; for( i = 0; i < tmpArrLen; i++) //空桶初始化 tmpArr[i] = 0; for(i = 0; i < len; i++) //寻访序列,并且把项目一个一个放到对应的桶子去。 tmpArr[ arr[i] ]++; for(i = 0, j = 0; i < tmpArrLen; i ++) { while( tmpArr[ i ] != 0) //对每个不是空的桶子进行排序。 { arr[j ] = i; //从不是空的桶子里把项目再放回原来的序列中。 j++; tmpArr[i]--; } }}int main(){ //测试数据 int arr_test[Max_len] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 }; //排序前数组序列 Show( arr_test, Max_len ); //排序 BucketSort( arr_test, Max_len); //排序后数组序列 Show( arr_test, Max_len ); return 0;}
26、
27、
28、
29、
30、
31、
32、
33、
34、
35、
36、
37、
38、
39、
40、
41、
42、
43、
44、
45、
46、
47、
48、
49、
50、
- 算法练习(二)
- Javascript算法练习(二)
- 算法练习笔记(二)
- LeetCode练习-动态规划算法(二)
- 排序算法练习二
- 算法练习二 堆排序
- 算法练习二:替换空格
- 基本算法题练习二
- 2013年3月算法练习(二) 闰年
- 排序算法自我练习(二)——选择排序
- 算法题练习系列之(二):矩阵最大值
- 算法题练习系列之(二十): 打印沙漏
- 算法题练习系列之(二十一): 人口普查
- 算法题练习系列之(二十二): 旧键盘
- 算法题练习系列之(二十三): 完美数列
- 算法题练习系列之(二十四): 查验身份证
- 算法题练习系列之(二十七): 有理数四则运算
- 算法练习---跳跃游戏二(动态规划)
- 让TextView 有滚动条的效果
- SQL中代替Like语句的函数charindex
- context:component-scan,spring注入
- 怎么做才能学好前端
- React Native Splashscreen实现
- 算法练习(二)
- [文件时间]_[Windows-macOS]_[修改文件的创建时间-修改时间]
- 第三方分享(友盟)
- SAP S/4 HANA的SMARTFORMS如何切换到非word编辑器
- 又好用又好装的PDF Expert
- shell 管理SpringBoot 生产环境服务 2
- linux中结束进程的两种方式:正常结束,异常结束
- opencv图像线性混合操作
- 如何在Linux服务器中隐藏PHP版本