亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    1.9 桶排序

    桶排序是計數(shù)排序的升級版。它利用了函數(shù)的映射關(guān)系,高效與否的關(guān)鍵就在于這個映射函數(shù)的確定。為了使桶排序更加高效,我們需要做到這兩點:

    1. 在額外空間充足的情況下,盡量增大桶的數(shù)量
    2. 使用的映射函數(shù)能夠?qū)⑤斎氲?N 個數(shù)據(jù)均勻的分配到 K 個桶中

    同時,對于桶中元素的排序,選擇何種比較排序算法對于性能的影響至關(guān)重要。

    1. 什么時候最快

    當輸入的數(shù)據(jù)可以均勻的分配到每一個桶中。

    2. 什么時候最慢

    當輸入的數(shù)據(jù)被分配到了同一個桶中。

    3. 示意圖

    元素分布在桶中:

    1.9 桶排序

    然后,元素在每個桶中排序:

    1.9 桶排序


    代碼實現(xiàn)

    JavaScript

    實例

    function bucketSort(arr, bucketSize) {
        if (arr.length === 0) {
          return arr;
        }

        var i;
        var minValue = arr[0];
        var maxValue = arr[0];
        for (i = 1; i < arr.length; i++) {
          if (arr[i] < minValue) {
              minValue = arr[i];                // 輸入數(shù)據(jù)的最小值
          } else if (arr[i] > maxValue) {
              maxValue = arr[i];                // 輸入數(shù)據(jù)的最大值
          }
        }

        //桶的初始化
        var DEFAULT_BUCKET_SIZE = 5;            // 設(shè)置桶的默認數(shù)量為5
        bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
        var bucketCount = Math.floor((maxValue minValue) / bucketSize) + 1;  
        var buckets = new Array(bucketCount);
        for (i = 0; i < buckets.length; i++) {
            buckets[i] = [];
        }

        //利用映射函數(shù)將數(shù)據(jù)分配到各個桶中
        for (i = 0; i < arr.length; i++) {
            buckets[Math.floor((arr[i] minValue) / bucketSize)].push(arr[i]);
        }

        arr.length = 0;
        for (i = 0; i < buckets.length; i++) {
            insertionSort(buckets[i]);                      // 對每個桶進行排序,這里使用了插入排序
            for (var j = 0; j < buckets[i].length; j++) {
                arr.push(buckets[i][j]);                      
            }
        }

        return arr;
    }

    Java

    實例

    public class BucketSort implements IArraySort {

        private static final InsertSort insertSort = new InsertSort();

        @Override
        public int[] sort(int[] sourceArray) throws Exception {
            // 對 arr 進行拷貝,不改變參數(shù)內(nèi)容
            int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

            return bucketSort(arr, 5);
        }

        private int[] bucketSort(int[] arr, int bucketSize) throws Exception {
            if (arr.length == 0) {
                return arr;
            }

            int minValue = arr[0];
            int maxValue = arr[0];
            for (int value : arr) {
                if (value < minValue) {
                    minValue = value;
                } else if (value > maxValue) {
                    maxValue = value;
                }
            }

            int bucketCount = (int) Math.floor((maxValue minValue) / bucketSize) + 1;
            int[][] buckets = new int[bucketCount][0];

            // 利用映射函數(shù)將數(shù)據(jù)分配到各個桶中
            for (int i = 0; i < arr.length; i++) {
                int index = (int) Math.floor((arr[i] minValue) / bucketSize);
                buckets[index] = arrAppend(buckets[index], arr[i]);
            }

            int arrIndex = 0;
            for (int[] bucket : buckets) {
                if (bucket.length <= 0) {
                    continue;
                }
                // 對每個桶進行排序,這里使用了插入排序
                bucket = insertSort.sort(bucket);
                for (int value : bucket) {
                    arr[arrIndex++] = value;
                }
            }

            return arr;
        }

        /**
         * 自動擴容,并保存數(shù)據(jù)
         *
         * @param arr
         * @param value
         */

        private int[] arrAppend(int[] arr, int value) {
            arr = Arrays.copyOf(arr, arr.length + 1);
            arr[arr.length 1] = value;
            return arr;
        }

    }

    PHP

    實例

    function bucketSort($arr, $bucketSize = 5)
    {
        if (count($arr) === 0) {
          return $arr;
        }

        $minValue = $arr[0];
        $maxValue = $arr[0];
        for ($i = 1; $i < count($arr); $i++) {
          if ($arr[$i] < $minValue) {
              $minValue = $arr[$i];
          } else if ($arr[$i] > $maxValue) {
              $maxValue = $arr[$i];
          }
        }

        $bucketCount = floor(($maxValue $minValue) / $bucketSize) + 1;
        $buckets = array();
        for ($i = 0; $i < count($buckets); $i++) {
            $buckets[$i] = [];
        }

        for ($i = 0; $i < count($arr); $i++) {
            $buckets[floor(($arr[$i] $minValue) / $bucketSize)][] = $arr[$i];
        }

        $arr = array();
        for ($i = 0; $i < count($buckets); $i++) {
            $bucketTmp = $buckets[$i];
            sort($bucketTmp);
            for ($j = 0; $j < count($bucketTmp); $j++) {
                $arr[] = $bucketTmp[$j];
            }
        }

        return $arr;
    }

    C++

    實例

    #include<iterator>
    #include<iostream>
    #include<vector>
    using namespace std;
    const int BUCKET_NUM = 10;

    struct ListNode{
            explicit ListNode(int i=0):mData(i),mNext(NULL){}
            ListNode* mNext;
            int mData;
    };

    ListNode* insert(ListNode* head,int val){
            ListNode dummyNode;
            ListNode *newNode = new ListNode(val);
            ListNode *pre,*curr;
            dummyNode.mNext = head;
            pre = &dummyNode;
            curr = head;
            while(NULL!=curr && curr>mData<=val){
                    pre = curr;
                    curr = curr>mNext;
            }
            newNode>mNext = curr;
            pre>mNext = newNode;
            return dummyNode.mNext;
    }

    ListNode* Merge(ListNode *head1,ListNode *head2){
            ListNode dummyNode;
            ListNode *dummy = &dummyNode;
            while(NULL!=head1 && NULL!=head2){
                    if(head1>mData <= head2>mData){
                            dummy>mNext = head1;
                            head1 = head1>mNext;
                    }else{
                            dummy>mNext = head2;
                            head2 = head2>mNext;
                    }
                    dummy = dummy>mNext;
            }
            if(NULL!=head1) dummy>mNext = head1;
            if(NULL!=head2) dummy>mNext = head2;
           
            return dummyNode.mNext;
    }

    void BucketSort(int n,int arr[]){
            vector<ListNode*> buckets(BUCKET_NUM,(ListNode*)(0));
            for(int i=0;i<n;++i){
                    int index = arr[i]/BUCKET_NUM;
                    ListNode *head = buckets.at(index);
                    buckets.at(index) = insert(head,arr[i]);
            }
            ListNode *head = buckets.at(0);
            for(int i=1;i<BUCKET_NUM;++i){
                    head = Merge(head,buckets.at(i));
            }
            for(int i=0;i<n;++i){
                    arr[i] = head>mData;
                    head = head>mNext;
            }
    }

    參考地址:

    https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/9.bucketSort.md

    https://zh.wikipedia.org/wiki/%E6%A1%B6%E6%8E%92%E5%BA%8F

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號