求逆序对个数--归并排序

归并排序想法很简单,和分治有点像 复杂度是 O(nlogn)空间复杂度O(N)

归并排序是稳定排序 在大规模信息处理外排序中用得比较多,如多路归并败者树。

练习手写了下归并排序,犯了n多错,都是很傻得错,下次写代码前一定要想清楚..

int buffer[1024];
int mege(int s[],int st,int e)
{
    
int n = 0;
    
if (e-st == 2)
    {
        
if (s[st] > s[e-1])
        {
            
int t = s[st];
            s[st] 
= s[e-1];
            s[e
-1= t;
            n
++;
        }
        
return n;
    }
    
else
    {
        
int mid = st +(e-st)/2;
        
int i = st,j = mid;
        
int index = 0;
        
while (i<mid && j<e )
        {
            
if (s[i] < s[j])
            {
                buffer[index] 
= s[i];
                i
++;
            }
            
else
            {
                buffer[index] 
= s[j];
                j
++;
            }
            index
++;
        }
        
if (i==mid)
        {
            
while (j<e)
            {
                buffer[index] 
= s[j];
                j
++;index++;
            }
        }
        
else
        {
            
while (i<mid)
            {
                buffer[index] 
= s[i];
                i
++;index++;
            }
        }
        
while(index--)
        {
            s[
--e] = buffer[index];
        }
    }
    
return 0;

}
int megersort(int s[],int st,int e)
{
    
if (e-st ==1)
    {
        
return 0;
    }
    
int mid = st + (e-st)/2;
    megersort(s,st,mid);
    megersort(s,mid,e);
    mege(s,st,e);
}

void main()
{
    
int s[] = {1 ,2,3,5,5,6,30,8,9,0};
    megersort(s,
0,10);
    
for (int i = 0;i<10;i++)
    {
        cout
<<buffer[i]<<" ";
    }
    cout
<<endl;

}    

 

 利用归并排序 我们还可以求逆序对的个数。

如果定义从小到大是正序的话, 所谓逆序对就是指,在数组中s[i]>s[j] 其中 i<j 的对数的个数。。

利用归并排序,只需要做一个很小的改动就可以得到:

int buffer[1024];
int mege(int s[],int st,int e)
{
    
int n = 0;
    
if (e-st == 2)
    {
        
if (s[st] > s[e-1])
        {
            
int t = s[st];
            s[st] 
= s[e-1];
            s[e
-1= t;
            n
++;
        }
        
return n;
    }
    
else
    {
        
int mid = st +(e-st)/2;
        
int i = st,j = mid;
        
int index = 0;
        
while (i<mid && j<e )
        {
            
if (s[i] <= s[j])
            {
                buffer[index] 
= s[i];
                i
++;
            }
            
else
            {
                buffer[index] 
= s[j];
                j
++;
                n 
= n + mid -i;
            }
            index
++;
        }
        
if (i==mid)
        {
            
while (j<e)
            {
                buffer[index] 
= s[j];
                j
++;index++;
            }
        }
        
else
        {
            
while (i<mid)
            {
                buffer[index] 
= s[i];
                i
++;index++;
            }
        }
        
while(index--)
        {
            s[
--e] = buffer[index];
        }
    }
    
return n;

}
int megersort(int s[],int st,int e)
{
    
if (e-st ==1)
    {
        
return 0;
    }
    
int mid = st + (e-st)/2;
    
int a = megersort(s,st,mid);
    
int b = megersort(s,mid,e);
    
return a++ mege(s,st,e) ;
}

void main()
{
    
int s[] = {1 ,2,3,5,5,6,30,8,9,0};
    cout
<<megersort(s,0,10)<<endl;
    
for (int i = 0;i<10;i++)
    {
        cout
<<buffer[i]<<" ";
    }
    cout
<<endl;
    

}    

 

 

 

posted @ 2010-08-14 15:30  David Luo  阅读(866)  评论(0编辑  收藏  举报