天天看點

二維數組的查找及向函數傳遞二維數組問題

問題:在一個二維數組中,每行的元素從左到右是遞增的,每列元素從上到下是遞增的。寫一個函數,查找一給定的元素是否在此數組中

輸入:一個二維數組,和一個待查找的數

輸出:待查找的數在數組中輸出“YES",否則輸出”NO"

原始思路:最簡單思路就是暴力搜尋,周遊一遍數組中的元素時間複雜度為O(n2)。但是這樣就沒有用問題的已知條件(從左到右、從上到下遞增),是以不是個好的解法

改進1:從第一行開始找,找到待查元素大的,如果還沒找到,接着從第二行開始找,直到找到或到最後一個元素為止(如圖),但是如果帶查找的元素在最後,還得周遊到最後,時間複雜度還是O(n2)

改進2:上來在随機在裡面挑一個,如果正好逮住,那就結束了;如果比待查找的元素大,那麼他的左邊和上邊;否則在右邊和下邊。如下圖。這樣下來可以減少一部分元素的比較。在尋找1時,會話費反而很多時間,并不是個好的解決辦法。

二維數組的查找及向函數傳遞二維數組問題

改進3:看兩個比較關鍵的兩個點——左下角和右上角。以右上角為例(如下圖)。如果右上角元素等于帶查找元素,那就傳回真;如果右上角元素大于待查找元素,那就删除右上角元素所在列;否則删除其所在行。依次進行下去。

二維數組的查找及向函數傳遞二維數組問題

舉例說明:

二維數組的查找及向函數傳遞二維數組問題

參考代碼一:

<a></a>

這裡注意幾個技術細節問題(c語言):

1.二維數組的定義——第二位長度必須指明

      我們知道一位數組定義可以不指名元素總的個數,例如int a[] = {1, 2, 3},編譯器會自動指派長度為3;對于字元char a[] = {'a', 'b', 'c'},自動指派為4,(因為字元數組末尾有個預設‘\0’字元)

二維數組的本質也是一維數組,其元素是數組。是數組的數組。但是初始化是第二位必須指明int a[][3]是可以的,但是int a[][]絕對不行的。究其這樣設計的原因:int a[][3]={1,2,3,4,5}是定義一個每個元素含有3和整形變量的數組的數組。編譯器會自動區分為{{1,2,3},{4,5}},但是如果第二維也給省略了,這樣編譯器也傻眼了,到底給每個數組賦多大值,是{{1,2,3},{4,5,0}},還是{{1,2,3,4},{5,0,0,0}}還是其他......

2.向函數中傳遞二維數組

 方法一:形參給出第二維大小

方法二:形參指明指向指針的 數組

對于方法二:這裡怎麼了解int (*a)[3]? 做個類比:應該都知道int  *a指指向整形變量的指針,等價于int  (*a)[1],[1]指明個數。那麼int (*a)[3]就是指明了3個指針,a指向第一個。不能去掉(),因為*的優先級小于[],對于a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},*a[2]指7。(a[2]指向第2個數組的指針,*取出第一個來)下面程式例證:

執行結果是7

對于方法一有個問題:怎麼知道二維數組第一維是多大?對于數組是沒有函數得知數組的大小,即傳給函數一個數組(數組名)不能得出數組的大小,可以利用sizeof函數得出。

3.sizeof

函數是用來得出一個對象或類型名的長度,機關是位元組。傳回類型為long unsigned int(c語言輸出格式為%lu)

文法:sizeof(object) //對象

         sizeof(type)   //類型

例如:

通過運作結果分析:

下面看一維數組:

運作結果:

 下面看二位數組

執行結果:

二維數組的查找及向函數傳遞二維數組問題

現在回顧先寫到程式,貌似不完全符合題意,題目是傳入一個二維數組,但是現在能做的的必須是傳入第二維的大小,可不可以直接往函數中直接傳二位數組呢?

4.二維數組傳給函數當一維數組用——利用下标轉換成一維數組的下标

*********************好了,修改下思路三***********************

參考代碼二:

本文轉自jihite部落格園部落格,原文連結:http://www.cnblogs.com/kaituorensheng/archive/2013/04/21/3033284.html,如需轉載請自行聯系原作者

繼續閱讀