計數排序:n個輸入元素的每個都是在0到k之間的整數(k爲某個整數)。ios
1.假設輸入數組是A[1..n],還須要兩個數組:B[1..n]存放排序的輸出,C[0..k]提供臨時存儲空間web
2.C[i]中存放等於 i 的元素的個數,i=0,1,,k數組
3.經過相加計算肯定有多少元素是小於等於i的spa
4.把每一個元素A[i]放到數組B正確的位置code
#include <iostream> #include <vector> using namespace std; void CountSort(vector<int> &arr, int maxVal) { int len = arr.size(); if (len < 1) return; vector<int> count(maxVal+1, 0); vector<int> tmp(arr); for (auto x : arr) count[x]++; for (int i = 1; i <= maxVal; ++i) count[i] += count[i - 1]; for (int i = len - 1; i >= 0; --i) { arr[count[tmp[i]] - 1] = tmp[i]; count[tmp[i]]--; //注意這裏要減1 } } int main() { vector<int> arr = { 1,5,3,7,6,2,8,9,4,3,3 }; int maxVal = 9; CountSort(arr,maxVal); for (auto x : arr) cout << x << " "; cout << endl; return 0; }
計數排序的升級版:計數排序計算等於某個值的元素的個數,桶排序則是計算值在cdn
某區間的元素的個數,每一個桶就是一個區間,分好後經過其餘排序方法進行桶內排序。blog
當待排序元素取值範圍過大或者不是整數時,就不能使用計數排序,可以使用桶排序。排序
1.計數排序io
計數排序須要根據原始數列的取值範圍,建立一個統計數組,用來統計原始數列中每個可能的整數值所出現的次數。class
原始數列中的整數值,和統計數組的下標是一一對應的,以數列的最小值做爲偏移量。好比原始數列的最小值是90,
那麼整數95對應的統計數組下標就是 95-90 = 5。
2.桶排序
每個桶(bucket)表明一個區間範圍,裏面能夠承載一個或多個元素。桶排序的第一步,就是建立這些桶,肯定每個桶的區間範圍:
具體創建多少個桶,如何肯定桶的區間範圍,有不少不一樣的方式。
當待排序元素在某個區間內分佈均勻時,桶排序效率很高,但若是分佈很不均勻,桶排序意義不大。
基數排序是先按最低位進行排序,依次向高位排。
前提是對每一位的排序必須是穩定的,例如能夠基於計數排序進行基數排序。