快排模板``
#include<iostream>
using namespace std;
void quick_sort(int l,int r,int q[])
{
if(l>=r) return ;
int x=q[l+r>>1],i=l-1,j=r+1;
while(i<j)
{
do i++; while(x>q[i]); //不用do while 语句会死循环。
do j--; while(x<q[j]);
if(i<j) swap(q[i],q[j]);
}
quick_sort(l,j,q);
quick_sort(j+1,r,q);
}
int main()
{
int n;
int a[10];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
quick_sort(0,n-1,a);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
}
归并排序模板
#include<iostream>
using namespace std;
const int N=1e5+5;
int tmp[N];
int q[N];
void merge_sort(int l,int r,int q[])
{
if(l>=r) return ;//这句忘记写了,导致死循环。。
int mid=l+r>>1;
int i=l,j=mid+1;
merge_sort(l,mid,q); merge_sort(mid+1,r,q);
int k=0;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) tmp[k++]=q[i++];
else tmp[k++]=q[j++];
}
while(i<=mid) tmp[k++]=q[i++];
while(j<=r) tmp[k++]=q[j++];
for(int i=0,j=l;j<=r;j++,i++)
q[j]=tmp[i];
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&q[i]);
merge_sort(0,n-1,q);
for(int i=0;i<n;i++)
printf("%d ",q[i]);
}
例题:
例题点这里
题目大致意思就是求逆序数数量,就是下标i比j小 但是值比j大的对数。
#include<iostream>
using namespace std;
const int N=1e5+5;
int tmp[N];
int q[N];
int merge_sort(int l,int r,int q[])
{
if(l>=r) return 0;
int mid=l+r>>1;
int i=l,j=mid+1;
int res=merge_sort(l,mid,q)+merge_sort(mid+1,r,q);
int k=0;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) tmp[k++]=q[i++];
else {
tmp[k++]=q[j++];
res+=mid-i+1;
}
}
while(i<=mid) tmp[k++]=q[i++];
while(j<=r) tmp[k++]=q[j++];
for(int i=0,j=l;j<=r;j++,i++)
q[j]=tmp[i];
return res;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&q[i]);
printf("%d ",merge_sort(0,n-1,q));
}