目录
写在前面:
没写到的就直接sort吧(bushi),本人蒟蒻,大佬%%%%。
发文助手也太狠了吧,动不动。。。。
1.基数排序
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e+6;
typedef long long ll;
ll a[MAX];
void scnf(int st,int n)
{
for(int i=1; i<=n; i++)cin>>a[i];
}
void print(int st,int n)
{
for(int i=st; i<=n; i++)cout<<a[i]<<" ";
}
int big(ll n)//寻找所给数据的最大位数
{
ll maxx=-1;
for(int i=1; i<=n; i++)maxx=max(maxx,a[i]);
if(maxx==0)return 1;
else
{
int ji=0;
while(maxx)
{
maxx/=10;
ji++;
}
return ji;
}
}
int tmp[MAX],ji[10];
void jipai(int n)
{
int d=big(n);
int radix=1;
while(d--)
{
for(int j=0; j<10; j++)ji[j]=0;
for(int j=1; j<=n; j++)
{
int k=(a[j]/radix)%10;
ji[k]++;//用名为ji的桶子来装某位是k的数字
}
for(int j=1; j<10; j++)ji[j]=ji[j-1]+ji[j];//将桶子连起来(即所谓1-n拼起来了,建议结合原理图)
for(int j=n; j>0; j--)//将数据存入桶子时,最后入的是后面出现的数据,“--”操作也是后面数据先出现,所以从n开始
{
int k=(a[j]/radix)%10;
tmp[ji[k]]=a[j];
ji[k]--;
}
for(int j=1; j<=n; j++)a[j]=tmp[j];
radix*=10;
}
}
int main()
{
int n;
cin>>n;
scnf(1,n);
jipai(n);
print(1,n);
}
2.归并排序
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e+6;
typedef long long ll;
ll a[MAX];
int temp[MAX];
void scnf(int st,int n)
{
for(int i=1; i<=n; i++)cin>>a[i];
}
void print(int st,int n)
{
for(int i=st; i<=n; i++)cout<<a[i]<<" ";
}
void Merge(int l1,int r1,int l2,int r2)
{
int i=l1,j=l2;
int index=0;
while(i<=r1&&j<=r2)
{
if(a[i]<=a[j])temp[index++]=a[i++];
else temp[index++]=a[j++];
}
while(i<=r1)temp[index++]=a[i++];
while(j<=r2)temp[index++]=a[j++];
for(int i=0; i<index; i++)a[l1+i]=temp[i];
}
void MergeSort(int l,int r)
{
if(l<r)
{
int mid=(l+r)/2;
MergeSort(l,mid);
MergeSort(mid+1,r);
Merge(l,mid,mid+1,r);
}
}
int main()
{
int n;
cin>>n;
scnf(1,n);
MergeSort(1,n);
print(1,n);
}
3.堆排序
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e+6;
typedef long long ll;
ll a[MAX];
void scnf(int st,int n)
{
for(int i=1; i<=n; i++)cin>>a[i];
}
void print(int st,int n)
{
for(int i=st; i<=n; i++)cout<<a[i]<<" ";
}
void HeapAdjust(int s,int m)
{
int jc=a[s];
for(int j=2*s; j<=m; j*=2)
{
if(j<m&&a[j]<a[j+1])j++;
if(jc>=a[j])break;
a[s]=a[j];
s=j;
}
a[s]=jc;
}
void heapsort(int n)
{
int te;
for(int i=n/2; i>0; i--)HeapAdjust(i,n);
for(int i=n; i>1; i--)
{
te=a[i];
a[i]=a[1];
a[1]=te;
HeapAdjust(1,i-1);
}
}
int main()
{
int n;
cin>>n;
scnf(1,n);
heapsort(n);
print(1,n);
}