搜索行排序的两个暗淡数组中的整数,有没有更好的方法?

时间:2012-10-02 07:40:57

标签: search coding-style

我最近遇到过这个问题, 你必须从排序的二维数组中找到一个整数。但是这两个dim数组按行而不是列排序。我已经解决了这个问题,但仍然认为可能有更好的方法。所以我来这里与大家讨论。您的建议和改进将帮助我提高编码能力。这是代码

int searchInteger = Int32.Parse(Console.ReadLine());
      int cnt = 0;
        for (int i = 0; i < x; i++)
        {
           if (intarry[i, 0] <= searchInteger && intarry[i,y-1] >= searchInteger)
           {
               if (intarry[i, 0] == searchInteger || intarry[i, y - 1] == searchInteger)
                  Console.WriteLine("string present {0} times" , ++cnt);
                  else
                  {
                      int[] array = new int[y];
                      int y1 = 0;
                      for (int k = 0; k < y; k++)
                      array[k] = intarry[i, y1++];
                      bool result;

                        if (result = binarySearch(array, searchInteger) == true)
                       {
                        Console.WriteLine("string present inside {0} times", ++ cnt);
                        Console.ReadLine();
                       }
                 }
           }

       }

其中searchInteger是我们必须在数组中找到的整数。二进制搜索是在单维数组中存在值(在该单行中)时返回布尔值的methiod。

请帮助,是最优还是有更好的解决方案。

由于

1 个答案:

答案 0 :(得分:1)

如果您已按如下方式声明了数组intarryxy

int[,] intarry =
{
    {0,7,2},
    {3,4,5},
    {6,7,8}
};
var y = intarry.GetUpperBound(0)+1;
var x = intarry.GetUpperBound(1)+1; 
// intarry.Dump();

你可以保持简单:

int searchInteger = Int32.Parse(Console.ReadLine());

var cnt=0;
for(var r=0; r<y; r++)
{
    for(var c=0; c<x; c++)
    {
        if (intarry[r, c].Equals(searchInteger)) 
        {
            cnt++;
            Console.WriteLine(
                "string present at position [{0},{1}]" , r, c);         
        } // if
    } // for
} // for
Console.WriteLine("string present {0} times" , cnt);                

此示例假定您没有任何关于数组是否已排序的信息(这意味着:如果您不知道它是否已排序,则必须通过每个元素并且不能使用二进制搜索) 。基于此示例,如果您更了解阵列中数据的结构,则可以优化性能:

  • 如果行按升序排序,则可以通过二进制搜索替换内部for循环
  • 如果整个数组按升序排序且数据不重复,例如

      

    int [,] intarry = {{0,1,2},{3,4,5},{6,7,8}};

    然后您可以在找到项目后立即退出循环。最简单的方法来创建 一个函数,并在内部for循环中添加一个return语句。