桶排序

作者: 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: 桶排序

相关文章

  • 算法基础 排序(一)

    桶排序冒泡排序快速排序 1.桶排序 所谓的桶排序就是列出所有的可能进行排序 小结:这里的桶排序只是简化版的.桶排序...

  • 《数据结构与算法之美》10——排序(三)桶排序、计数排序、基数排

    桶排序 概念 桶排序,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排序之后,再把...

  • 桶排序

    什么是桶排序桶排序是计数排序的衍化桶排序需要创建若干个桶来装元素协助排序。每一个桶(bucket)代表一个区间范围...

  • 桶排序,计数排序和基数排序

    桶排序 桶排序的核心思路 桶排序的核心处理思想是先定义几个有序的桶,将要排序的数组按照桶划分的值的范围分到这几个桶...

  • 桶排序与哈希桶排序

    一.桶排序 算法原理 桶排序 (箱排序)的原理是将待排序序列分到有限数量的桶里面,然后对每个桶再分别排序(可以使用...

  • php-计数排序、基数排序、桶排序

    计数排序、基数排序、桶排序 时间复杂度 O(n) 计数排序 基数排序 桶排序

  • 数组-桶排序

    采用桶排序方式对数组进行排序 桶排序百科:桶排序(Bucket Sort),或者所谓的箱排序是一种非比较排序.工作...

  • 13|桶排序

    桶排序( Bucket sort )首先,我们来看桶排序。桶排序,顾名思义,会用到 “ 桶 ” ,核心思想是将要排...

  • 线性排序

    桶排序 核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排序完之后,再把每个桶里的数...

  • 排序算法(3)- 桶排序、计数排序、基数排序

    桶排序(Bucket sort) 将要排序的数据分到几个有序的桶里,每个桶里面再单独进行排序,最后把每个桶里的数据...

网友评论

      本文标题:桶排序

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