- 论坛徽章:
- 0
|
本帖最后由 冰水1101 于 2011-12-12 13:52 编辑
思路:
“在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。“
我们可知这个二维数组(a[m][n])以及它内部任意一个二维数组 的 左上角的数(a[0][0])都是最小的,右下角的数(a[m-1][n-1])都是最大的。
做法:
首先设我们要查找的数为x,二维数组(a[m][n]),且行小于列(m<n)。其中count初始值为1,
(1)如果要查找的数小于左上角的数,或是大于右下角的数,return false。
(2)如果等于左上角的数,或是等于右下角的数,return ture。
(3)对最后一列进行折半查找,找到第一个大于x的数a[ii][n-count] ((ii>=0)&&(ii<m))
(4)对最后一行进行折半查找,找到第一个大于x的数a[m-count][j] ((j>=0)&&(j<n))
(5)数组的范围缩小到a[ii][j] 到a[m-count-1][n-count-1],count++,从(1)开始进行
稍候上传代码
谢谢hbmhalley 的指正。(欢迎再来指正,谢谢)
更改具体做法:
首先设我们要查找的数为x,二维数组(a[][]),且行小于列(m<n)。其中count初始值为1,
(1)如果要查找的数小于左上角的数,或是大于右下角的数,return false。
(2)如果等于四个角的数(左上角、左下角、右上角、右下角),return ture。
(3)如果第一列的最后一个数小于x,则跳到(4)。否则,对第一列折半查找,找到x 则return ture,否则定位到这一列里比x小但和x最近的数a[ii][0] 。
(4)如果第一行的最后一个数小于x,则跳到(5)。否则,对第一行折半查找,找到x 则return ture,否则定位到这一行里比x小但和x最近的数a[0][j] 。
(ps:经过(4)以后,数组中我们的查找范围就缩小到从a[0][0]到a[ii][j] i行j列的数组了)
(5)对j列进行折半查找,找到x 则return ture,否则找到第一个大于x的数a[p][j] ((p>=0)&&(p<ii))
(6)对i行进行折半查找,找到x 则return ture,否则找到第一个大于x的数a[ii][q] ((q>=0)&&(q<j))
(ps:经过(6)以后,数组的范围缩小到a[p][q] 到a[ii][j]
(7)重复(1)开始进行 |
|