【算法分析与设计】计数排序(CountingSort)

一、基本原理
计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用此信息就可以确定x在输出数组中的位置。在计数排序的代码中,假设输入是一个数组A,此外,我们还需要两个数组,数组B(存放排序后的输出),数组C(提供临时存储空间,大小为k,k是数组A中最大的元素)

二、伪代码描述
COUNTING-SORT(A,B,k)
let C[0…k] be a new array
for i=0 to k
C[i]=0
for j=1 to A.length
C[A[j]]=C[A[j]]+1
for i=1 to k
C[i]=C[i]+C[i-1]
for j=A.length downto 1
B[C[A[j]]]=A[j]
C[A[j]]=C[A[j]]-1

三、C++实现

#include 
#include 
#define MAX 100
using namespace std;
int A[MAX];
int B[MAX];
void Count_Sort(int A[], int B[], int n, int k);
void ShowArray(int A[], int n);
int main()
{
     
    int maxnum=0;
    printf("请输入元素的个数:\n");
    int n;
    cin>>n;
    cout<<"请在接下来的"<<n<<"行内分别输入数组的元素:"<<endl;
    for(int i=0; i<n; i++)
    {
     
        cin>>A[i];
        if(A[i]>maxnum)
            maxnum=A[i];
    }
    cout<<maxnum<<endl;
    Count_Sort(A, B, n, maxnum);
    cout<<"计数排序后的结果为:"<<endl;
    ShowArray(B,n);
    cout<<endl;
}

void Count_Sort(int A[], int B[], int n, int k)
{
     
    int C[k+1];
    for(int i=0; i<=k; i++)
        C[i]=0;
    for(int j=0; j<n; j++)
        C[A[j]]=C[A[j]]+1;
    for(int i=1; i<=k; i++)
    {
     
        C[i]=C[i]+C[i-1];
    }
    for(int j=n-1; j>=0; j--)
    {
     
        B[C[A[j]]-1]=A[j];
        C[A[j]]=C[A[j]]-1;
    }
}

void ShowArray(int A[], int n)
{
     
    for(int i=0; i<n-1; i++)
        cout<<A[i]<<' ';
    cout<<A[n-1]<<endl;
}

运行结果:
【算法分析与设计】计数排序(CountingSort)_第1张图片四、Python实现

def Counting_Sort(A,n,k):
    C=[]
    B=[]
    for i in range(k+1):
        C.append(0)
    for i in range(n):
        C[A[i]]+=1
        B.append(0)
    for i in range(1,k+1):
        C[i]=C[i-1]+C[i]
    i=n-1
    while i>=0:
        B[C[A[i]]-1]=A[i]
        C[A[i]]=C[A[i]]-1
        i-=1
    return B

print("请输入数组元素的个数:")
n=int(input())
L=[]
maxnum=0
print("请在{:d}行内分别输入数组的元素:".format(n))
for i in range(n):
    m=int(input())
    L.append(m)
    if m>maxnum:
        maxnum=m
B=Counting_Sort(L,n,maxnum)
print("计数排序后的数组为:")
print(B)

运行结果:
【算法分析与设计】计数排序(CountingSort)_第2张图片

你可能感兴趣的:(C/C++,Python,算法,python)