随笔-8  评论-0  文章-1  trackbacks-0
/*
 问题描述:
 设a[0:n-1]是一个有n个元素的数组,k(0<=k<=n-1)是一个非负整数.试设计一个算法将子数组
 a[0:k]与a[k+1:n-1]换位.要求算法在最坏情况下耗时O(n), 且只用到O(1)的辅助空间.
*/

/*求解思想:
  算法的时间复杂度很容易保证,想弄出O(n*n)的算法都会很困难,关键是要保证只用到O(1)的辅助空间。
  可以用递归分治的算法思想。
*/

public class ChangePosition 
{
  
public void swap(int a[],int begin,int second,int size)
  
{
      
int tmp=0;
      
for(int i=0;i<size;i++)
      
{
          tmp
=a[i+begin];
          a[i
+begin]=a[i+second];
          a[i
+second]=tmp;
      }

  }

  
public void change(int a[],int begin,int k,int nlen)
  
{
      
int first=k+1;
      
      
int second=nlen-first;
  
      
if(second<=0||first<0)
      
{
             
return  ;
      }

      
else
      
{
          
if(first<=second)
          
{  
              
               swap(a,begin,first
+begin,first);
               change(a,begin
+first,first-1,nlen-first);
          }

          
else 
          

              
              swap(a,begin,begin
+first,second);
              change(a,begin
+second,first-1-second,nlen-second); 
      }

      }

  }

  
public void print(int[]a,int size)
  
{
       
for(int i=0;i<size;i++)
       
{
           System.out.print(a[i]
+" ");
       }

       System.out.println();
  }

  
/*
    第二种方法的思想是我们把一个数组的两个部分分别逆序,然后将整个数组再次逆序,
    逆序两次以后就可以得到该问题的解,如果可以想到的话问题就很简单了!
  
*/
 
  
public void reverse(int[]a,int begin,int end)
  
{
      
int n=(begin+end)/2;
      
int tmp=0;
      
for(int i=begin;i<=n;i++)
      
{
          tmp
=a[i];
          a[i]
=a[end];
          a[end]
=tmp;
          end
--;
      }

  }

 
      
  
public static void main(String[] args)
  
{
      
int[] a={0,1,2,3,4,5,6,7,8,9};
      ChangePosition cp
=new ChangePosition();
      cp.change(a,
0,1,10);
      cp.print(a,
10);
      
int[] b={0,1,2,3,4,5,6,7,8,9};
    cp.reverse(b,
0,2);
    cp.reverse(b,
3,9);
    cp.reverse(b,
0,9);
    cp.print(b,
10);
  }

   
}
posted on 2008-06-09 21:04 夏日清风 阅读(613) 评论(0)  编辑  收藏 所属分类: 算法

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问