两数组的问题?

两数组的问题? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061217001324138.html
问题1:找出两数组的不同数和共有数的值和位置,和同值同位置的值存入数组s1……s9  
  如:  
  数组值r1为{   1,   6,23,15,   5,28,   8,11,10,19}  
  数组值r2为{   2,23,   4,15,   5,17,12,11,   3}  
   
  需要找出:  
  数组值r1不同数的值:           s1   {1,6,28,8,10,19}  
  数组值r1不同数的位置:       s2   {0,1,5,6,8,9}  
  数组值r2不同数的值:           s3   {2,4,17,12,3}  
  数组值r2不同数的位置:       s4   {0,2,5,6,8}  
  两数组共有数的值:               s5   {23,15,5,11}  
  两数组共有数r1的位置:       s6   {2,3,4,7}  
  两数组共有数r1的位置:       s7   {1,3,4,7}  
  两数组同值同位置的值:       s8   {15,5,11}  
  两数组同值同位置的位置:   s9   {3,4,7}  
   
  注意:实际应用中是动态数组,而且还很大,需要一个精简的办法!!  
   
   
   
   
  问题2:把数组按数值从小到大排列。同上注意!!!

var  
      R1:   array   of   Integer;  
      R2:   array   of   Integer;  
      SL1:   TStringList;  
      SL2:   TStringList;  
      Idx:   Integer;  
      Index:   Integer;  
      S1:   array   of   Integer;  
      S2:   array   of   Integer;  
      S3:   array   of   Integer;  
      S4:   array   of   Integer;  
      S5:   array   of   Integer;  
      S6:   array   of   Integer;  
      S7:   array   of   Integer;  
      S8:   array   of   Integer;  
      S9:   array   of   Integer;  
  begin  
      Setlength(R1,   10);  
      SetLength(R2,   9);  
      R1[0]   :=   1;  
      R1[1]   :=   6;  
      R1[2]   :=   23;  
      R1[3]   :=   15;  
      R1[4]   :=   5;  
      R1[5]   :=   28;  
      R1[6]   :=   8;  
      R1[7]   :=   11;  
      R1[8]   :=   10;  
      R1[9]   :=   19;  
   
      R2[0]   :=   2;  
      R2[1]   :=   23;  
      R2[2]   :=   4;  
      R2[3]   :=   15;  
      R2[4]   :=   5;  
      R2[5]   :=   17;  
      R2[6]   :=   12;  
      R2[7]   :=   11;  
      R2[8]   :=   3;  
   
      SL1   :=   TStringList.Create;  
      SL2   :=   TStringList.Create;  
   
      //'%.8d'的目的有2个,  
      //其一是排序,   其二是满足大数据  
   
      for   Idx   :=   Low(R1)   to   High(R1)   do  
          SL1.Add(Format('%.8d',   [R1[Idx]]));  
   
      for   Idx   :=   Low(R2)   to   High(R2)   do  
          SL2.Add(Format('%.8d',   [R2[Idx]]));  
   
      //为了显示方便,我用了ListBox.  
      //在你的实际程序中你可以用TStringList来代替.  
   
      ListBox1.Sorted   :=   True;  
      ListBox2.Sorted   :=   True;  
      ListBox3.Sorted   :=   True;  
      ListBox4.Sorted   :=   True;  
      ListBox5.Sorted   :=   True;  
      ListBox6.Sorted   :=   True;  
      ListBox7.Sorted   :=   True;  
      ListBox8.Sorted   :=   True;  
      ListBox9.Sorted   :=   True;  
   
      for   Idx   :=   0   to   Pred(SL1.Count)   do      
      begin  
          Index   :=   SL2.IndexOf(SL1[Idx]);  
          if   Index   <   0   then  
          begin  
              ListBox1.Items.Add(SL1[Idx]);  
              ListBox2.Items.Add(Format('%.8d',   [Idx]));  
          end   else  
          begin  
              ListBox5.Items.Add(SL1[Idx]);  
              ListBox6.Items.Add(Format('%.8d',   [Idx]));  
              ListBox7.Items.Add(Format('%.8d',   [Index]));  
              if   Idx   =   Index   then  
              begin  
                  ListBox8.Items.Add(SL1[Idx]);  
                  ListBox9.Items.Add(Format('%.8d',   [Idx]));  
              end;  
          end;  
      end;  
   
      for   Idx   :=   0   to   Pred(SL2.Count)   do  
      begin  
          if   SL1.IndexOf(SL2[Idx])   <   0   then  
          begin  
              ListBox3.Items.Add(SL2[Idx]);  
              ListBox4.Items.Add(Format('%.8d',   [Idx]));  
          end;  
      end;  
   
      //剩下的工作就是把Listbox   --->   s数组,  
      //我只写一个,其余的照葫芦画瓢}  
       
      SetLength(S1,   ListBox1.Items.Count);  
      for   Idx   :=   0   to   Pred(ListBox1.Items.Count)   do  
          S1[Idx]   :=   StrToInt(ListBox1.Items[Idx]);  
   
      //上面算法的前提  
      //1、是每个数组自身没有重复数  
      //2.   R1的长度大于等于R2的长度  
   
    //如要满足任何条件,算法基本没有大的变化,   只是多了一个遍历  
   
   
  end;

你可能感兴趣的:(数组)