计数排序 - 桶思维O(n+k)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int a[105];
int main()
{
int n,tmp,maxv=-1e9,minv=1e9;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&tmp);
a[tmp]++;
if(maxv<tmp)maxv=tmp;
if(minv>tmp)minv=tmp;
}
for(int i=minv;i<=maxv;i++)
{
while(a[i]!=0)
{
printf("%d ",i);
a[i]--;
}
}
return 0;
}
快速排序 - 二分 O(n*logn)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int n,a[100005];
void quicksort(int l,int r)
{
int mark=a[l];
int i=l,j=r;
if(l>=r)return ;
while(i!=j)
{
while(i<j && a[j]>=mark)
j--;
if(i<j)a[i]=a[j];
while(i<j && a[i]<=mark)
i++;
if(i<j)a[j]=a[i];
}
a[i]=mark;
quicksort(l,i-1);
quicksort(i+1,r);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
归并排序 - 洛谷P1177
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int n;
long long a[100005];
void merge(long long a[],int l,int r,int mid)
{
long long b[r-l+1];
int i,j,k;
for(i=l;i<=r;i++)
b[i-l]=a[i];
i=l;
j=mid+1;
for(k=l;k<=r;k++)
{
if(i>mid)
{
a[k]=b[j-l];
j++;
}
else if(j>r)
{
a[k]=b[i-l];
i++;
}
else if(b[i-l]>b[j-l])
{
a[k]=b[j-l];
j++;
}
else
{
a[k]=b[i-l];
i++;
}
}
}
void merge_sort(long long a[],int l,int r)
{
if(l>=r)return ;
int mid=(l+r)/2;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
merge(a,l,r,mid);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<=n-1;i++)
scanf("%lld",&a[i]);
//quicksort(1,n);
merge_sort(a,0,n-1);
for(int i=0;i<n-1;i++)
printf("%lld ",a[i]);
printf("%lld\n",a[n-1]);
return 0;
}
归并流程:
合并两个有序数组