2016-10-31 17 views
2

我有一個任務,在使用動態內存時對負數和正數進行排序,因此在這種情況下,我使用calloc和冒泡排序來排列負數數字第一,而不改變他們的順序。問題是當我輸入偶數個整數時,在結果的中間會出現一些隨機的10位數的負數。奇數個整數不會發生同樣的情況。什麼似乎是問題?如果在冒泡排序程序中輸入偶數個整數,則在中間插入一個隨機數

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 1000 

void swap(int *arr, int n) { 
    int i, j, temp; 
    for (i = 0; i <= n; i++) { 
     for (j = 1; j <= n; j++) { 
      if (arr[j] < 0) { 
       temp = arr[j]; 
       arr[j] = arr[j - 1]; 
       arr[j - 1] = temp; 
      } 
     } 
    } 
    printf("sorted integers to negative and positive: \n"); 
    for (i = 0; i < n; i++) { 
     printf("%i ", arr[i]); 
    } 
} 

int main() { 
    int n; 
    int i, *sk; 
    printf("Enter integer: \n"); 
    scanf("%d", &n); 
    printf("Enter %i integers: \n", n); 
    sk = (int*)calloc(sizeof(int), n); 
    for (i = 0; i < n; i++) { 
     scanf("%d", sk + i); 
    } 
    swap(sk, n); 
    return 0; 
} 
+0

你有使用調試器和/或連基本的調試打印語句來跟蹤你的程序的執行?這是在代碼中調試問題的標準方法(只有在所有調試工作失敗的情況下才會發布到Stackoverflow)。 – kaylum

回答

0

您的for圈2級經典的錯誤:

for (i = 0; i <= n; i++)因爲循環運行n + 1時間幾乎總是錯的,它僅應枚舉從0n - 1的索引值。

您在第二個循環中有一個相同的錯誤:測試j <= n使您走得太遠,超出數組末尾。一些隨機值會混入數組中,但這種未定義的行爲可能會導致更糟的後果。

此外,您的對比測試不正確,應該是if (arr[j] < arr[j-1])。作爲一個經驗法則,無論何時在循環測試中看到<=運算符,再次看,這可能是一個錯誤。

這裏是一個修正版本:

void swap(int *arr, int n) { 
    int i, j, temp; 
    for (i = 0; i < n; i++) { 
     for (j = 1; j < n; j++) { 
      if (arr[j] < arr[j - 1]) { 
       temp = arr[j]; 
       arr[j] = arr[j - 1]; 
       arr[j - 1] = temp; 
      } 
     } 
    } 
    printf("sorted integers to negative and positive: \n"); 
    for (i = 0; i < n; i++) { 
     printf("%i ", arr[i]); 
    } 
    printf("\n"); 
} 
1

這是這種情況發生,只有當你碰巧進入偶數整數本身體現你不確定的行爲,但在現實中的問題是永遠存在的:你從一個過去-the-讀取值數組的末尾,並且它到達數組的中間。

您可以通過更改i <= nj <= ni < nj < n來解決此問題。但是,這不會解決您的破碎排序算法,因爲交換條件也不正確。取而代之的

if(arr[j]<0) 

應該

if(arr[j]<arr[j-1]) 
+0

嗨,謝謝你的回答,改變<= to

+1

@Žilvinas:我對你對排序問題的評論感到困惑:你能發佈實際的輸入和輸出嗎? – chqrlie

+0

輸入整數:輸入8點的整數: -5 -9 -6 -2 -6 排序整數陰性和陽性: -9 -6 -6 -5 - 2 6 10 55 好吧,我可能不小心把這樣的正數,但無論如何,儘管如此,他們都按傾斜順序排序 –