2017-03-22 62 views
1

我需要對數組中的奇數或偶數進行排序,同時保持其餘的不變。由於這是內存管理課程的一部分,我強烈希望不要複製任何數據,所以我沒有選擇明顯的解決方案。只對數組中的奇數或偶數排序

我想通過跳過比較的「壞」第一或第二參數來使用簡單的氣泡排序功能。我只會發布該函數,因爲其餘部分都是不相關的。

//these are passed as sort_type_remainder 
#define REMAINDER_EVEN 0 
#define REMAINDER_ODD 1 

void sort_integers(int *integer_list, int num_integers, int sort_type_remainder) 
{ 
    int i, j, aux, offset = 1; 
    for(i = 0; i < num_integers - 1; i++) 
    { 
     offset = 1; 
     for(j = 0; j + offset < num_integers - i; j++) 
     { 
      if(abs(integer_list[j] % 2) != sort_type_remainder) //first element to be compared is of wrong type, skip 
      { 
       j++; 
      } 
      else 
      { 
       //first element is of good type, but second element is not, increase offset and reloop first element 
       if(abs(integer_list[j + offset] % 2) != sort_type_remainder) 
       { 
        j--; 
        offset++; 
       } 
       else //both elements are of good type, bubble sort them 
       { 
        if(integer_list[j] > integer_list[j + offset]) 
        { 
         aux = integer_list[j + offset]; 
         integer_list[j + offset] = integer_list[j]; 
         integer_list[j] = aux; 
        } 
        offset = 1; 
       } 
      } 
     } 
    } 
} 

這種工作,但一些輸入處理不當,我不明白爲什麼。我嘗試減小輸入大小以獲得更簡單的方法來重現此問題,但只要我這樣做,它就能正常工作。

這裏是輸入/輸出,我刪除了偶數,因爲他們留在他們的位置,它使得錯誤更容易注意到。

odd 
20 
13 5 -3 4 2 -7 23 -33 1 6 -8 7 10 -51 9 -5 12 92 69 55 

output

任何幫助或建議將不勝感激,優選地具有解釋不只是一個解決方案。

編輯::完整的程序是在這裏,不希望混亂的問題http://pastebin.com/vZDcmppV

+0

請選擇一種語言,C或C++。使用C++,它大約是使用算法函數的3或4行解決方案。 – PaulMcKenzie

+0

@PaulMcKenzie我做到了,對不起,沒想到它很重要。我更感興趣的是爲什麼我的方法不起作用,而不是更好的解決方案。 – aron9forever

+1

這是學習如何使用調試器的絕佳機會,如果以前沒有做過。使用調試器,您可以逐行執行代碼,同時監視變量及其值。通過這種方式,您可以看到代碼的真實情況。或者,您可以先嚐試一些[橡皮鴨調試](https://en.wikipedia.org/wiki/Rubber_duck_debugging)。 –

回答

0

如果你需要從一個陣列奇數或偶數號碼進行排序,這是我的方法:

我會首先從起始數組中選取所有奇數或偶數,具體取決於您想要做什麼,用指標取代所有數字(1或2取決於您想排序的賠率還是平均數)。

然後自行對數組進行排序(如果您想使用除泡泡排序以外的其他算法,非常有用)。

然後你只需掃描你的第一個數組,通過取代每個指定的數字取決於它們的位置。

簡而言之:

你想要把每個奇(甚至)數量從陣列1到陣列2,並通過指標取代它們(東西后scaning陣列1,當你可能認識)。

要排序數組2.

那麼你一定要通過每一個元素從數組來代替每個指示燈2.

+0

您可能想要發佈一些示例代碼,示例數據結構或其他內容,因爲我不明白您的建議。 –

+0

我剛剛編輯了一個簡短的解釋。 –

+0

感謝您的輸入,但是您忽略了我提到的第二句話,我想避免重複數據。 – aron9forever