排序——计数、快速、归并排序模版
像冒泡、选择这些常见的排序就不在此写。
至于排序一些原理百度有很多,在此不赘述。
计数排序(桶+前缀和)
为什么感觉这个排序还不如桶排序?OVO
int a[500005],b[500005],c[500005];
int main()
{
int n;
cin >> n;
int minn=inf,maxx=-1;
for(int i=0;i<n;i++)
{
cin >> a[i];
minn=min(minn,a[i]);
maxx=max(maxx,a[i]);
}
for(int i=0;i<n;i++)
b[a[i]-minn+1]++;
for(int i=1;i<=maxx-minn+1;i++)
b[i]+=b[i-1];
for(int i=0;i<n;i++)
c[b[a[i]-minn]++]=a[i];
for(int i=0;i<n;i++) cout << c[i] << ' ';
}
快速排序
int a[500005];
void quicksort(int l,int r)
{
int i=l,j=r;
int mid=(l+r)>>1;
int x=a[mid];
while(i<=j)
{
while(a[i]<x) i++;
while(a[j]>x) j--;
if(i<=j)
{
swap(a[i],a[j]);
i++,j--;
}
}
if(l<j) quicksort(l,j);
if(i<r) quicksort(i,r);
}
int main(int argc, char *argv[]) {
int n;
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
quicksort(0, n-1);
for(int i=0;i<n;i++)
cout << a[i] << ' ';
}
归并排序
int a[500005],b[500005];
int a[500005],b[500005];
void merge(int l,int mid,int r)
{
int p1=l,p2 = mid + 1; //左右区间的第一个
for(int i=l;i<=r;i++)
{
if((p1<=mid) && ((p2>r) || (a[p1] <= a[p2])))
{
b[i]=a[p1];
p1++;
}
else {
b[i]=a[p2];
p2++;
}
}
for(int i=l;i<=r;i++) a[i] = b[i];
}
void binary_merge(int l,int r)
{
int mid=(l+r)>>1;
if(l<r)
{
binary_merge(l, mid);
binary_merge(mid+1, r);
}
merge(l,mid,r);
}
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
cin >> a[i];
binary_merge(0, n-1);
for(int i=0;i<n;i++)
cout << a[i] << ' ';
}