时间复杂度为O(n)的排序算法

我们常用的排序算法,如快排,堆排序等时间复杂度都为O(nlgn),这些算法都有一个特点,就是在排序过程中需要进行大量的比较,我们称之为基于比较的排序算法,而这些基于比较的排序算法的时间复杂度不可能突破O(nlgn)。本文所介绍的算法是基于非比较的排序,其时间复杂度为线性。

I、计数排序

假设我们有一个待排序数组A,其中元素的最小值不小于0,最大值不超过K,我们需要建立一个长度为K的线性表C,用来记录每个元素的个数。这类似于hash的原理。

1.1 算法思路

1、遍历A,填充线性表C;
2、遍历线性表C,依次根据输出C[i]个i;
3、假设元素个数为n个,其中不重复元素为m个,则时间复杂度为O(m+n),空间复杂度也为O(m+n);

1.2 代码实现
#include 
#include 

using namespace std;

#define K 100
vector count(K, 0);

void CountingSort(const vector& vec) {
    for (int i = 0; i < vec.size(); ++i) {
        count[vec[i]]++;
    }
}

void myPrint() {
    for (int i = 0; i < K; ++i) {
        while (count[i]) {
            cout << i << " ";
            --count[i];
        }
    }
}

int main() {
    vector vec = {0,1,2,3,3,2,5,3,2,2,54,6,23,35,4,2,54,4};

    CountingSort(vec);
    myPrint();

    return 0;
}

II、此类算法还有桶排序与基数排序

以后再说明。

欢迎转载,转载请注明出处wenmingxing 时间复杂度为O(n)的排序算法

你可能感兴趣的:(时间复杂度为O(n)的排序算法)