SDUT-3399

来源:互联网 发布:绥化学院教务管理网络 编辑:程序博客网 时间:2024/05/21 06:29

交换排序的次数问题。。。

代码:

#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。。。
原创粉丝点击