zoukankan      html  css  js  c++  java
  • 桶排序(Bucket Sort)

    桶排序是另外一种以O(n)或者接近O(n)的复杂度排序的算法. 它假设输入的待排序元素是等可能的落在等间隔的值区间内.一个长度为N的数组使用桶排序, 需要长度为N的辅助数组. 等间隔的区间称为桶, 每个桶内落在该区间的元素. 桶排序是基数排序的一种归纳结果

     

    算法的主要思想: 待排序数组A[1...n]内的元素是随机分布在[0,1)区间内的的浮点数.辅助排序数组B[0....n-1]的每一个元素都连接一个链表.将A内每个元素乘以N(数组规模)取底,并以此为索引插入(插入排序)数组B的对应位置的连表中. 最后将所有的链表依次连接起来就是排序结果.

    这个过程可以简单的分步如下:

    1. 设置一个定量的数组当作空桶子。
    2. 寻访序列,并且把项目一个一个放到对应的桶子去。
    3. 对每个不是空的桶子进行排序。
    4. 从不是空的桶子里把项目再放回原来的序列中。

     

    note: 待排序元素越均匀, 桶排序的效率越高. 均匀意味着每个桶在中间过程中容纳的元素个数都差不多,不会出现特别少或者特别多的情况, 这样在排序子程序进行桶内排序的过程中会达到最优效率.

    note: 将元素通过恰当的映射关系将元素尽量等数量的分到各个桶(值区间)里面, 这个映射关系就是桶排序算法的关键.桶的标记(数组索引Index)的大小也要和值区间有对应关系。

    以下是一段桶排序的源码:

    #include <stdio.h>    
    #include <stdlib.h>    
    #include <string.h>    
       
    extern void quick_sort(int a[], int p, int q);/* not necessary */   
       
    struct barrel {    
        int node[10];    
        int count;/* the num of node */   
    };    
       
    void bucket_sort(int data[], int size)    
    {    
        int max, min, num, pos;    
        int i, j, k;    
        struct barrel *pBarrel;    
       
        max = min = data[0];    
        for (i = 1; i < size; i++) {    
            if (data[i] > max) {    
                max = data[i];    
            } else if (data[i] < min) {    
                min = data[i];    
            }    
        }    
        num = (max - min + 1) / 10 + 1;    
        pBarrel = (struct barrel*)malloc(sizeof(struct barrel) * num);    
        memset(pBarrel, 0, sizeof(struct barrel) * num);    
       
        /* put data[i] into barrel which it belong to */   
        for (i = 0; i < size; i++) {    
            k = (data[i] - min + 1) / 10;/* calculate the index of data[i] in barrel */   
            (pBarrel + k)->node[(pBarrel + k)->count] = data[i];    
            (pBarrel + k)->count++;    
        }    
            
        pos = 0;    
        for (i = 0; i < num; i++) {    
            quick_sort((pBarrel+i)->node, 0, (pBarrel+i)->count);/* sort node in every barrel */   
       
            for (j = 0; j < (pBarrel+i)->count; j++) {    
                data[pos++] = (pBarrel+i)->node[j];    
            }    
        }    
        free(pBarrel);    
    }    
       
    main()    
    {    
        int data[] = {78, 17, 39, 26, 72, 94, 21, 12, 23, 91}, i;    
        int size = sizeof(data) / sizeof(int);    
        bucket_sort(data, size);    
       
        for (i = 0; i < size; i++)    
            printf("%d ", data[i]);    
    }   
    

      

  • 相关阅读:
    史上最全的浏览器 CSS & JS Hack 手册
    JavaScript1.6数组新特性和JQuery的几个工具方法
    用jquery循环map
    javascript强大的日期函数
    用 javascript 判断 IE 版本号
    常见排序算法基于JS的实现
    JavaScript中callee,caller,argument的理解
    apply()方法和call()方法
    虽然我们可能不想对元素应用3D变换,可我们一样可以开启3D引擎
    在移动端上加上代码,让字体变得平滑
  • 原文地址:https://www.cnblogs.com/lvxz/p/3293376.html
Copyright © 2011-2022 走看看