桶排序

作者: helinyu | 来源:发表于2022-02-18 15:19 被阅读0次

    例子: 给数据进行排序。 现在默认是10个桶

    #include <iostream>
    #include <unordered_map>
    #include<iterator>
    #include<vector>
    using namespace std;
    
    const int BUCKET_NUM = 10; // 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; // 设置虚拟节点的mNext
        pre = &dummyNode; // 前面一个的地址
        curr = head; // 当前的节点
        while(NULL!=curr && curr->mData<=val){
            pre = curr;
            curr = curr->mNext; //找到当前上一个的数据
        }
        newNode->mNext = curr; // 插入这个数据  pre> newNode > cur
        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)); // vertor有10个元素 , 看看能够扩充桶的大小
        for(int i=0;i<n;++i){
            int index = arr[i]/BUCKET_NUM; // 也就是0~9 , 也就是间距10为一个单位
            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)); // 合并每个bucket上的内容
        }
        for(int i=0;i<n;++i){
            arr[i] = head->mData;
            head = head->mNext;
        }
    }
    
    int main() {
        int a[] = {22,3,2,5,4,6,7,10,9,8};
        BucketSort(10, a);
        printf("");
        return 0;
    }
    
    

    PS: 桶排序

    相关文章

      网友评论

          本文标题:桶排序

          本文链接:https://www.haomeiwen.com/subject/vrdylrtx.html