C++ 桶排序(BucketSort)

一、思路

     是將[0,1]區間劃分爲n個等長的子區間。然後,將各個元素按照自己所屬的區間放入相應的桶中,只需要將每個桶的元素排好序,依次輸出各個桶內的元素,就得到了有序的元素序列。

二、實現程序:

#include <iostream>
using namespace std;

const int offset = 105; // 爲桶的邊界
const int maxSize = 100; // 數組的最大存儲範圍

// 桶排序
template <typename T>
void BucketSort(T arr[], int n);
// 輸出數組
template <typename T>
void Print(T arr[], int n);

int main(int argc, const char * argv[]) {
    int n, i, arr[maxSize];
    
    cout << "請輸入要排序的數的個數:";
    cin >> n;
    srand((int)time(NULL)); // 設置時間爲隨機點
    for(i = 0; i < n; i++) // 產生n個隨機數
        arr[i] = rand() % 100;
    cout << "排序前:";
    Print(arr, n);
    BucketSort(arr, n); // 調用桶排序
    std::cout << "排序後:";
    Print(arr, n);
    return 0;
}

template <typename T>
void BucketSort(T arr[], int n) {
    int i, j;
    T buckets[offset];
    
    for(i = 0; i < offset; i++) // 清零
        buckets[i] = 0;
    // 1.計數,將數組arr中的元素放到桶中
    for(i = 0; i < n; i++)
        buckets[arr[i]]++; // 將arr[i]的值對應buckets數組的下標,每有一個就加1
    // 2.排序
    for(i = 0, j = 0; i < offset; i++) {
        while(buckets[i] > 0) { // 說明存有元素,相同的整數,要重複輸出
            arr[j] = i;
            buckets[i]--;
            j++;
        }
    }
}

// 輸出數組
template <typename T>
void Print(T arr[], int n) {
    int i;
    
    for(i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;
}

 測試結果: