基数排序和计数排序

计数排序

时间复杂度:O(N)

举例:假设我们有如下员工需要按照身高排序

员工身高
a b c d e
150 167 176 149 160

就正常而言,人类的正常身高不会超过300cm,因此我们可以生成300个桶,每个桶代表相应的身高,将每个员工分别放在桶中,然后依次倒出,便得到排序后的序列。

#include<iostream>
#include<cstdlib>
using namespace std;
class CountingSort {
public:
    int* countingSort(int* A, int n)
    {
        int i,j,min,max;
        for(i=1,min=max=A[0];i<n;i++)
        {
            if(A[i]<=min)
                min=A[i];
            if(A[i]>max)
                max=A[i];
        }
        int *counts=(int *)calloc(max-min+1,sizeof(int));
        if(!counts)
            exit(-1);
        for(i=0;i<n;i++)
            counts[A[i]-min]++;
        for(i=0,j=0;i<max-min+1;i++)
            while(counts[i])
            {
                A[j]=i+min;
                counts[i]--;
                j++;
            }
        free(counts);
        counts=NULL;
        return A;

    }
};
int main()
{
    int arr[]={150, 167, 176, 149, 160};
    CountingSort a;
    a.countingSort(arr,5);
    for(int i=0;i<5;i++)
        cout<<arr[i]<<" ";
    cout<<endl;
    return 0;
}

基数排序

时间复杂度:O(N)

举例:假设有如下序列需要排序

015, 021, 084,012, 101, 079

假设所输入的数字都是十进制数,我们生成0-9十个桶,将数字统一长度,不足补0,然后分别对位排序。

  1. 按照个位排序:021, 101, 012, 084, 015, 079
  2. 按照十位排序:101, 015, 012, 021, 079, 084
  3. 按照百位排序:015, 012, 021, 079, 084, 101

注意:桶倒出的次序是按照先进先出的原则。

#include<iostream>
#include<math.h>
using namespace std;
#define N 10
class RadixSort
{
public:
    int* radixSort(int* A, int n,int radix)

    {
        int temp[10][N]={0},order[10]={0};
        int m=(int)pow((double)10,radix-1),base=1;
        while(base<=m)
        {
            int i,k;
            for(i=0;i<n;i++)
            {
                int lsd=(A[i]/base)%10;
                temp[lsd][order[lsd]]=A[i];
                order[lsd]++;
            }
            for(i=0,k=0;i<10;i++)
            {
                if(order[i])
                {
                    int j;
                    for(j=0;j<order[i];j++,k++)
                        A[k]=temp[i][j];
                }
                order[i]=0;
            }
            base*=10;
        }
        return A;
    }
};
int main()
{
    int arr[]={101, 21, 12, 84, 15, 79};
    RadixSort a;
    a.radixSort(arr,6,10);
    for(int i=0;i<6;i++)
        cout<<arr[i]<<" ";
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011926899/article/details/81628135