算法练习(二)

来源:互联网 发布:软件开发认证证书 编辑:程序博客网 时间: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、