1.冒泡排序
时间复杂度:O(n^2)
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
2.选择排序
时间复杂度:O(n^2)
for(int i=0;i<n-1;i++)
{
int t=i;
for(int j=i;j<n;j++)
{
if(a[j]<a[t])t=j;
}
int tmp=a[t];
a[t]=a[i];
a[i]=tmp;
}
3.桶排序
时间复杂度:O(n)
例: https://pintia.cn/problem-sets/1132101708662992896/problems/1132102434076258304
int b[105]={0};
void fun(int a[],int n)
{
int t=0;
for(int i=0;i<n;i++)
{
b[a[i]]++;//精髓所在
t++;
}
for(int i=100;i>=0;i--)
{
for(int j=0;j<b[i];j++)
{
if(t==1)
{
printf("%d",i);
return;
}
else{
printf("%d ",i);
t--;
}
}
}
4.快速排序
时间复杂度:O(nlogn)
void quick_sort(int a[],int ll,int rr)
{
if(ll>=rr)return;
int k=a[ll];
int l=ll,r=rr;
while(ll<rr)
{
//注意 要先从右端开始 这样才能把k换掉
while(ll<rr&&a[rr]<=k)
rr--;
a[ll]=a[rr];
while(ll<rr&&a[ll]>=k)
ll++;
a[rr]=a[ll];
}
a[ll]=k;
quick_sort(a,l,ll-1);
quick_sort(a,ll+1,r);
}
P.S 不知这个有什么bug
}
int Partition ( SqList L,int low, int high )
{
int k=L.elem[low];
while(low<high)
{
while(low<high&&L.elem[low]<=k)low++;
while(low<high&&L.elem[high]>=k)high--;
int tmp=L.elem[low];
L.elem[low]=L.elem[high];
L.elem[high]=tmp;
}
int tmp=L.elem[low];
L.elem[low]=k;
L.elem[k]=tmp;
return low;
}
5.插入排序
时间复杂度:O(n^2)
void insertsort(int a[],int n)
{
for(int i=1;i<n;i++)
{
int tmp=a[i];
int p=0;
while(a[p]<a[i])p++;
for(int j=i;j>p;j--)a[j]=a[j-1];//后移
a[p]=tmp;//插入
}
}
6.归并排序
时间复杂度:O(nlogn)
(1)精髓:merge函数
void merge(int a[],int l,int r)
{
int tmp[10005];
int k=0,q=m+1;
int p=l;
int m=l+(r-l)/2;
while(p<=m&&q<=r)
{
if(a[p]<=a[q]){
tmp[k++]=a[p++];
}
else
{
tmp[k++]=a[q++];
}
}
while(p<=m)tmp[k++]=a[p++];
while(q<=r)tmp[k++]=a[q++];
for(int i=l;i<=r;i++)
a[i]=tmp[i-l];
}
(2)递归
void mergesort(int a[],int l,int r)
{
if(l>=r)return;
int mid=l+(r-l)/2;
mergesort(a,l,mid);
mergesort(a,mid+1,r);
merge(a,l,r);
}