排序相关算法之桶排序

来源:互联网 发布:淘宝商家条形码是什么 编辑:程序博客网 时间:2024/06/03 07:17

看千遍知识,不如写百行代码。
开始我的FB之旅。

从最简单的排序开始。写一下桶排序方法。
输入:一堆待排序的数字(10,23,43,54,323…)
输出:排序好的结果

首先简单解释一下什么叫桶排序。首先列出一个数组a[M],我们把这个数组比作大小为M的桶组合, 每个数组元素象征了一个桶。假设待排序的数字总数为N个,将这N个数字丢到M个桶里,丢放规则可以自定,比如可以利用取余法,如针对具体某个数字n,做取余s=n%M,则将该数字n有序的放到第s个桶里。这里放入后会出现两种情况,第一种情况:当桶足够大,待排序数组足够小的话,待排序的数组可以放入互不重叠的桶里,每个桶里只有一个待排序数组的数字或者没有被放入数字。第二种,就是有多余2个数字被丢入了同一个桶里,这里需要做的是,保证每个桶里的数字是有序的。放好后会得到M个有序排列的桶,接下来就需要通过融合,将这M个有序排列的子数组合并成一个长的数组,从而得到排序结果。

所以说事实上,桶排序只是通过增加额外的空间,来进行排序的目的,平均复杂度可以达到O(n)。

实现代码如下:
BucketSort.h

#include<vector>const int BucketNum = 4;struct ListNode{    int data;    explicit ListNode(int i) :data(i), mNext(NULL) {}    ListNode* mNext;};class BucketsSort{public:    BucketsSort();    ~BucketsSort();    void bucket_sort(int n,int array[]);private:    std::vector<ListNode *> buckets;    ListNode* merge(ListNode *head1,ListNode*head2);};

BucketSort.cpp

#include "BuctetSort.h"#include <iostream>BucketsSort::BucketsSort():buckets() {    for (int i = 0;i < BucketNum;i++) {        ListNode *h = new ListNode(0);        buckets.push_back(h);    }}BucketsSort::~BucketsSort() {    for (int i = 0;i < buckets.size();i++) {        buckets[i]->mNext = NULL;        delete buckets[i];    }}void BucketsSort::bucket_sort(int n, int array[]) {    for (int i = 0;i < n;i++) {        int m = array[i] % BucketNum;        ListNode *p = buckets[m];        ListNode *q = p->mNext;        if (q == NULL) {            p->mNext = new ListNode(array[i]);        }else {            while (q!=NULL && q->data > array[i]) {                q = q->mNext;                p = p->mNext;            }            ListNode *tmp = new ListNode(array[i]);            p->mNext = tmp;            tmp->mNext = q;        }    }    ListNode* head = buckets[0]->mNext;    for (int i = 1;i < BucketNum;i++) {        head = merge(head, buckets[i]->mNext);    }    ListNode *p = head;    for (int i = 0;i < n;i++) {        array[i] = head->data;        head = head->mNext;    }    while (p != NULL) {        ListNode*tmp = p;        p = p->mNext;        delete tmp;    }}ListNode* BucketsSort::merge(ListNode *head1, ListNode*head2) {    ListNode *head=new ListNode(0);    ListNode *p = head;    while (head1 != NULL &&head2 != NULL) {        if (head1->data > head2->data) {            head->mNext = head1;            head1 = head1->mNext;        }        else {            head->mNext = head2;            head2 = head2->mNext;        }        head = head->mNext;    }    if (head1 == NULL)head->mNext = head2;    if (head2 == NULL) head->mNext = head1;    return p->mNext;}

main 函数

#include "BuctetSort.h"#include<iostream>using namespace std;void print(int n,int array[]) {    for (int i = 0;i < n;i++) {        cout << array[i] << "  ";    }    cout << endl;}int main() {    const int NUM = 100000;    BucketsSort *h = new BucketsSort();    srand((unsigned)time(NULL));    int *array=new int[NUM];    for (int i = 0;i < NUM;i++) {        array[i] = rand()%1000;    }    h->bucket_sort(NUM , array);    delete array;    delete h;    return 0;}
1 0
原创粉丝点击