排序
快排(O(nlogn)--O(n2))
click!!
void qsort(int l,int r)
{
int i,j,mid,p;
i=l; j=r;
mid=a[(l+r) / 2]; //将当前序列在中间位置的数定义为分隔数
do
{
while (a[i]<mid) i++; //在左半部分寻找比中间数大的数
while (a[j]>mid) j--; //在右半部分寻找比中间数小的数
if (i<=j)
{ //若找到一组与排序目标不一致的数对则交换它们
p=a[i];
a[i]=a[j];
a[j]=p;
i++; j--; //继续找
}
}
while (i<=j); //注意这里不能有等号
if (l<j) qsort(l,j); //若未到两个数的边界,则递归搜索左右区间
if (i<r) qsort(i,r);
}
归并(O(nlog(n))
click!!
void msort(int s,int t)
{
if(s==t) return; //如果只有一个数字则返回,无须排序
int mid=(s+t)/2;
msort(s,mid); //分解左序列
msort(mid+1,t); //分解右序列
int i=s, j=mid+1, k=s; //接下来合并
while(i<=mid && j<=t)
{
if(a[i]<=a[j])
{
r[k]=a[i]; k++; i++;
}else{
r[k]=a[j]; k++; j++;
}
}
while(i<=mid) //复制左边子序列剩余
{
r[k]=a[i]; k++; i++;
}
while(j<=t) //复制右边子序列剩余
{
r[k]=a[j]; k++; j++;
}
for(int i=s; i<=t; i++) a[i]=r[i];
return 0;
}
逆序对
click!!
void msort(int s,int t)
{
if(s==t) return; //如果只有一个数字则返回,无须排序
int mid=(s+t)/2;
msort(s,mid); //分解左序列
msort(mid+1,t); //分解右序列
int i=s, j=mid+1, k=s; //接下来合并
while(i<=mid && j<=t)
{
if(a[i]<=a[j])
{ r[k]=a[i]; k++; i++;
}else{
r[k]=a[j]; k++; j++;
ans+=mid-i+1; //统计产生逆序对的数量
}
}
while(i<=mid) //复制左边子序列剩余
{
r[k]=a[i]; k++; i++;
}
while(j<=t) //复制右边子序列剩余
{
r[k]=a[j]; k++; j++;
}
for(int i=s; i<=t; i++) a[i]=r[i];
return 0;
}

浙公网安备 33010602011771号