一、计数排序
使用这个算法有一个前提,待排序的数组a,其所有的元素分布在区间[0,k],该算法的时间复杂度为O(n+k),当k=O(n)时,运行时间为O(n),所以当k比较小的时候适合采用这个算法
下面给出这个算法实现的代码
#include <iostream>
using namespace std;
void counting_sort ( int a[], int k, int len ) {
int c[100] = {0};
int b[100] = {0};
// 初始化
for ( int i = 0; i < k; ++i ) {
c[i] = 0;
}
// 统计计数
for ( int i = 0; i < len; ++i ) {
c[a[i]]++;
}
for ( int i = 1; i <= k; ++i ) {
c[i] += c[i-1];
}
for ( int i = len - 1; i >= 0; --i ) {
b[c[a[i]]] = a[i];
c[a[i]]--;
}
for ( int i = 0; i < len; ++i ) {
a[i] = b[i];
}
}
int main()
{
int a[] = {4,6,8,3,8,2,9,3,1,0,8,9,1,9,8,0,8,9,8,8,3,2};
int len = sizeof(a) / sizeof(int);
counting_sort(a,9,len);
for ( int i = 0; i < len; ++i ) {
cout << a[i] << " ";
}
return 0;
}
二、基数排序
三、桶排序