2013-01-15 108 views
0

分配練習,我感到困惑:訂購使用二維動態數組

我們的n整數隨機順序的數組和工作需要我們用下面規定的方法對它們進行排序。

首先我們把整數行以下兩條規則:

  1. 我們把整一個整數的頂部僅b如果< b
  2. 否則,我們將整數在一個新行

這2條規則用於對數組進行排序。當我們完成應用規則時,我們選擇一個較小的可見整數,一次一個,直到它們被排序。

的鍛鍊需要使用3個數組:

  1. data[1...n]包含數字進行排序
  2. column[1...n,1...]
  3. number[1..n]其表示整數的每一列上的總數

例如,如果

data = [3,2,12,8] 

然後column是:

column[1,1] = 3 
column[2,1] = 2 
column[1,2] = 12 
column[2,2] = 8 

而且number[2,2]

我試圖做一個循環(請記住,在英文的僞代碼可能是一個比我正在學習不同在我的自然語言)

for counter=1 to n 
    number[counter]:=0; 
end for 

for counter=1 to n 
    a := 1; 
    b := 1; 

    if data[counter] < column[a,number[b]] or number[b]=0 then 
     number[b] := number[b] + 1; 
     column[a,number[b]] := data[counter]; 
    else 
     a:=a+1; 
     b:=b+1; 
    end if 
end for 

但是這個代碼有很多錯誤。有人可以試圖解釋我的邏輯錯在哪裏嗎?

+0

另一個問題是,如果我能解決簡單的算法,我應該感到氣餒嗎?我應該放棄嗎?算法是否可以解決您可以學習的問題這是一個經驗問題嗎?如果我花了7-8個小時沒有成功,我是否應該嘗試明確思考的明天? – n17n

+0

在試圖分析僞代碼之前,試着理解*爲什麼*算法具有它所做的步驟?用這種方式安排價值是什麼讓你做的? *爲什麼*它工作? – JaredC

+0

我的問題是它不起作用。我再也不能想清楚爲什麼了。 – n17n

回答

0

由於您不知道最終將使用多少個rows,因此您需要使用可擴展的數據結構來表示rows,因此請使用列表。其次,由於rows正在堆疊數字,所以每行應該是一個堆棧。像

List<Stack<Integer>> rows = new ArrayList<Stack<Integer>>(); 

然後你的算法將最終成爲O(n^2)。您可以通過輸入你就會陷入循環,將它們添加到行,你去

for(int i: input){ 
    boolean done = false; 
    for(int x=0; x < rows.size() && ! done; i++) 
    if(row.peep() > i){ 
     row.add(i); 
     done = true; 
    } 
    if(!done) 
    row.add(i); 
} 

當您完成填補了行,下一步就是讀取整數回來。你應該可以從這裏拿走它。