2014-07-11 207 views
-3

我想使用插入排序對數組進行排序。
我沒有改變和重新排列數組本身的元素,而是使用另一個名爲rank的數組來映射指向原始數組。
這裏是我的代碼通過插入排序排序數組

int i,j; 
int ar[] = {50,14,51,25,10}; 
int rank[] = {0,1,2,3,4}; 
for(i=1 ; i< 5 ; ++i) // second element onwards 
{ 
    int temp = rank[i]; // stores current value in temp variable  

    /** 
    * temp = 1 
    * j = 0 
    */ 
    j = rank[i] - 1; 
    while (ar[temp] < ar[ rank[j] ] && j > -1) 
    { 
     rank[j+1] = rank[j];  // move elemnts in map forward 
     j--; 
    } // end loop 

    // insert temp at proper place 
    rank[j+1] = temp;  

} 

for(i=0 ; i< 5 ; ++i) 
    printf("Rank : %d, Number : %d \n",rank[i],ar[i]); 

但是,它不是給人一種預期的輸出。任何人都可以指出邏輯中的錯誤嗎?

+2

您將不得不進一步縮小它,而不僅僅是「它不工作」。獲取簡單的測試用例,使用調試器並跟蹤代碼的執行情況。很可能,這將幫助您找到解決方案。如果不是,它至少會縮小到特定的代碼部分。 – wolfPack88

+0

'j =等級[i] -1;'。你是想減少元素「i」中的值還是在'i'之前訪問元素? –

+0

我用netbeans調試器。我發現j是-2而不是停在-1。所以我在while循環中添加了額外的約束j> -1,當j = -1時,然後在while循環中應該返回false來終止它。但它是真實的,我不知道爲什麼。 – Shashi

回答

1

您邏輯缺陷是如下: 在這個代碼段

while (ar[temp] < ar[ rank[j] ] && j > -1) 
    { 
     rank[j+1] = rank[j];  // move elemnts in map forward 
     j--; 
    } // end loop 

rank[j]裝置的值中的ar[j]秩。

而當你使用ar[rank[j]],你是比較ar[temp]"the rank of the value at ar[ j ]"索引值,這意味着你是不是比較在rank[]排序部分的最大價值。

因此,你可能不會進入這個循環即使ar[temp]次之

例如:

循環#期間到目前爲止2 (i = 2)

AR []:{50 ,14,51,25,10};

rank []:{1,0,2,3,4}; ({1,0}是秩[]的排序部)

0只意味着14{50,14}最小值 AND ar[rank[2]]ar[0])(的ar[]掃描部)僅恰好是在{50,14}巧合

如果此值(ar[rank[2]])不是最大的,恰好是比ar[temp]較小最大值(ar[]掃描的部分),你的程序將只跳過循環。即使ar[temp]小於ar[]的所有其他值

0
rank[j+1] = rank[j] 

沒有意義。你應該交換它們。

0

這是代碼,我不得不把數據結構上課的時候......

在它檢查伏,而條件... ...和循環裏面移動V中的元素...

在你在一個數組中進行比較的代碼,然後在另一個數組中移動......如果你需要元素的原始位置,你可以將數組複製到一個新數組中,然後對新數組進行排序,而不是創建這些排列......(If你真的需要這些級別,我敢肯定你可以創建,而你排序)

+0

如何在代碼部分添加而不是圖片?也許翻譯它... – dragosht