常見排序算法——桶排序(箱子排序)bucket Sort

桶排序是一個經典的排序算法,特點是速度快,算法複雜度爲O(n),且是穩排,當然也是最耗空間的一種算法。

例如:
1)排序一組數[7,3,19,11,6,8,1,15]
最大數是19,那首先創建20個空桶,接着就是把這些數依次放進對應的桶中;
這裏寫圖片描述
2)有重複的元素,如[7,3,9,11,6,3,7,14],這時候應該保證每個桶能放入多個元素,即最終保證排序穩定性,所以我選擇用鏈表來存儲每個桶中的元素,沒有元素則爲空鏈表。
這裏寫圖片描述

以下代碼使用了我學習時寫的單向鏈表chain.h,類似於STL中forward_list。

/**************************************
*函數名稱:bucketSort
*參數說明:theChain 一個保存待排序的所有元素的單向鏈表
          range 數組中的最大數
*  類說明:chain.h是個單向鏈表,前面學習線性表的時候創建
          包含size(),empty(),get(index),erase(index),insert(index,element)
          等成員函數
***************************************/
#include<iostream> 
#include"chain.h"
using namespace std;

void bucketSort(chain<int> &theChain, int range)
{
    //初始化桶
    chain<int> *bucket = new chain<int>[range + 1];
    int numberOfElements = theChain.size();

    //從鏈表中一次取下元素,分別插入到對應的桶中
    for (int i = 0; i < numberOfElements; ++i)
    {
        int x = theChain.get(0);
        theChain.erase(0);
        bucket[x].insert(0, x);
    }

    //依次從每個桶中取出元素插入到鏈表中
    for(int j = range; j >= 0; --j)
        while (!bucket[j].empty())
        {
            int y = bucket[j].get(0);
            bucket[j].erase(0);
            theChain.insert(0, y);
        }
    delete[] bucket;
}

int main()
{
    chain<int> c;
    for (int i = 0; i < 10; ++i)
        c.insert(0, i + 1);
    cout << c << endl;  //10,9,8,7,6,5,4,3,2,1

    bucketSort(c, 10);  //1,2,3,4,5,6,7,8,9,10
    cout << c << endl;
    return 0;
}
發佈了30 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章