当前位置:编程学习 > C/C++ >>

poj 2299

题意:求冒泡的交换次数。

分析:求快排的逆序数。这题直接用冒泡会超时的,虽然时间有7000MS,所以选择时间效率高的归并排序。

代码:

[cpp]
<span style="font-family:KaiTi_GB2312;font-size:18px;">#include<iostream> 
#include<algorithm> 
using namespace std; 
int s[500010]; 
int left_t[500010]; 
int right_t[500010]; 
long long ct; 
void merge(int s[],int p,int q,int r) 

     int i,j,k; 
     int n1=q-p+1; 
     int n2=r-q; 
     for(i=1;i<=n1;i++) 
       left_t[i]=s[p+i-1]; 
     for(i=1;i<=n2;i++) 
       right_t[i]=s[q+i]; 
     left_t[n1+1]=0x7fffffff; 
     right_t[n2+1]=0x7fffffff; 
     i=j=1; 
     for(k=p;k<=r;k++) 
     { 
       if(left_t[i]<=right_t[j]) 
       { 
         s[k]=left_t[i]; 
         i++; 
       } 
       else 
       { 
         s[k]=right_t[j]; 
         j++; 
         ct+=n1-i+1; 
       } 
     } 

          
void mergesort(int s[],int p,int r) 
{ www.zzzyk.com
    int q; 
    if(p<r) 
    { 
      q=(p+r)/2; 
      mergesort(s,p,q); 
      mergesort(s,q+1,r); 
      merge(s,p,q,r); 
    } 

int main() 

    int n; 
    while(cin>>n,n) 
    { 
       ct=0; 
       for(int i=0;i<n;i++) 
          cin>>s[i]; 
       mergesort(s,0,n-1); 
       cout<<ct<<endl; 
    } 
    return 0; 

</span> 

 

 


作者:hellobabygogo3
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,