非比較排序

當脫離了比較排序模型的時候,(nlgn)這一下界就再也不適用。

1.計數排序

計數排序: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;
}

 

 

2.桶排序

計數排序的升級版:計數排序計算等於某個值的元素的個數,桶排序則是計算值在cdn

某區間的元素的個數,每一個桶就是一個區間,分好後經過其餘排序方法進行桶內排序。blog

當待排序元素取值範圍過大或者不是整數時,就不能使用計數排序,可以使用桶排序。排序

 

和計數排序的比較

1.計數排序io

計數排序須要根據原始數列的取值範圍,建立一個統計數組,用來統計原始數列中每個可能的整數值所出現的次數。class

原始數列中的整數值,和統計數組的下標是一一對應的,以數列的最小值做爲偏移量。好比原始數列的最小值是90,

那麼整數95對應的統計數組下標就是 95-90 = 5。

 

2.桶排序

每個桶(bucket)表明一個區間範圍,裏面能夠承載一個或多個元素。桶排序的第一步,就是建立這些桶,肯定每個桶的區間範圍:

 具體創建多少個桶,如何肯定桶的區間範圍,有不少不一樣的方式。

 

當待排序元素在某個區間內分佈均勻時,桶排序效率很高,但若是分佈很不均勻,桶排序意義不大。

 

 

3.基數排序

基數排序是先按最低位進行排序,依次向高位排。

前提是對每一位的排序必須是穩定的,例如能夠基於計數排序進行基數排序。

 

相關文章
相關標籤/搜索