交换排序的次数问题。。。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[100010],b[100010],sum=0,sum2;
void pao(int a[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=n-1;j>i;j--)
if(a[j]<a[j-1])
{
sum++;
swap(a[j],a[j-1]);
}
}
int part(int a[],int s,int t)
{
int i=s,j=t;
int tmp=a[i];
while(i<j)
{
while(i<j&&a[j]>=tmp)
j--;
if(i!=j)
{
a[i]=a[j];
sum2++;
}
while(i<j&&a[i]<=tmp)
i++;
if(i!=j)///相等不交换!
{
a[j]=a[i];
sum2++;
}
}
a[i]=tmp;
return i;
}
void quicksort(int a[],int s,int t)
{
int i;
if(s<t)
{
i=part(a,s,t);
quicksort(a,s,i-1);
quicksort(a,i+1,t);
}
}
int main()
{
int n,i;
while(cin>>n)
{
sum=sum2=0;
for(i=0;i<n;i++)
{
cin>>a[i];
b[i]=a[i];
}
pao(a,n);
quicksort(b,0,n-1);
cout<<sum<<' '<<sum2<<endl;
}
return 0;
}
一开始也不知道快排的交换次数怎么计算,总感觉挺难的。。。(脆弱的心理)交换交换,顾名思义;自己真是太渣了,写的题还是少,就是要注意当数组的两个遍历下标相等时就不算一次交换了!因为当i和j两个遍历下标相等时,指向的是同一个数组元素!相当于自己给自己赋值了。。。
附上一张图,纪念一下:
好大一张图!!!hhhhhh。。。