计数排序
计数排序是用了一个缓存数组储存了数组A的信息,用下表表示A数组的值,C数组的的值表示个数,然后经过countsort函数中第一个for循环C的数值就表示对应A【i】比其小的数有多少个相当于位序然后再把它排列到B数组中
时间复杂度O(n)
#include <iostream>
#include <vector>
using namespace std;
void countsort(int A[],int B[],int k,int n)
{
int *C;
int j;
C=new int[k+1]{};
for (int i=1;i<=n;i++)
C[A[i]]=C[A[i]]+1;
for (j=1;j<=k;j++)
C[j]=C[j]+C[j-1];
for (j=n;j>=1;j--)
{
B[C[A[j]]]=A[j];
C[A[j]]--;
}
}
int main()
{
int n,i,k=-10000000000;
cin>>n;
int A[n+1];
for (i=1;i<=n;i++)
{
cin>>A[i];
if(A[i]>k)
k=A[i];
}
int B[n+1];
countsort(A,B,k,n);
for(i=1;i<=n;i++)
cout<<B[i]<<" ";
return 0;
}
基数排序
计数排序原理还是计数排序,只是多了位,通过低位到高位一位一位排序最终得到结果
时间复杂度:O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法
#include <iostream>
using namespace std;
void printA(int A[],int n)
{
for (int i = 0;i<n;i++)
{
cout << A[i] << " ";
}
cout << endl;
}
int maxbit(int data[],int n)
{
int b=1;
int x=10;
for(int i=0;i<n;i++)
{
while(data[i]>x)
{
x*=10;
b++;
}
}
return b;
}
void radixsort(int A[],int n)
{
int b=maxbit(A,n);
int T[n];
int C[10];
int i,j,k,radix=1;
for (i=1;i<=b;i++)
{
for (j=0;j<10;j++)
C[j]=0;
for (j=0;j<n;j++)
{
k=(A[j]/radix)%10;
C[k]++;
}
for (j=1;j<10;j++)
C[j]=C[j-1]+C[j];
for (j=n-1;j>=0;j--)
{
k=(A[j]/radix)%10;
T[C[k] - 1] = A[j];
C[k]--;
}
for (j=0;j<n;j++)
A[j]=T[j];
radix*=10;
}
}
int main()
{
int n;
cin>>n;
int A[n];
for (int i=0;i<n;i++)
cin>>A[i];
radixsort(A,n);
printA(A,n);
return 0;
}
桶排序
桶排序细节可以改很多原理和计数排序差不多不多解释
平均时间复杂度:O(n)
#include <iostream>
#include <vector>
using namespace std;
void bucketsort(int A[],int MAX,int n)
{
vector <int>B(MAX+1,0);
int i,j,count=1;
for (i=1;i<=n;i++)
B[A[i]]++;
for (i=0;i<=MAX;i++)
{
if(B[i]>0)
{
for(j=0;j<B[i];j++)
{
A[count]=i;
count++;
}
}
}
}
int main()
{
int n,i,MAX=-10000000000;
cin>>n;
int A[n+1];
for (i=1;i<=n;i++)
{
cin>>A[i];
if(A[i]>MAX)
MAX=A[i];
}
bucketsort(A,MAX,n);
for (i=1;i<=n;i++)
cout<<A[i]<<" ";
return 0;
}