簡體   English   中英

C中的插入排序程序給出了奇怪的結果

[英]Insertion Sort program in C giving weird result

該程序產生了意外結果。 我認為將數組返回到main()中存在問題。

#include <stdio.h>

int *isort(int array[], int size)
{
    int i, j, key;
    for (j = 1; j < size; j++) {
        array[j] = key;
        i = j - 1;
        while (i > 0 && array[i] > key) {
            array[i + 1] = array[i];
            i--;
        }
        array[i + 1] = key;
    }
    return array;
}   

main()
{
    int array[100], size, i, *result;

    printf("\nSIZE: ");
    scanf("%d", &size);

    printf("\nARRAY: ");

    for (i=0; i<size ; i++)
        scanf("%d\t", &array[i]);

    result = isort(array, size);

    for (i=0; i<size; i++)
        printf("%d\n", array[i]);
} 

作業中的一個錯誤很嚴重! 更正為:

array[j] = key; // it is undefined to assign with an uninitialized variable  

應該:

key = array[j];

編輯:另一個邏輯錯誤是您不在內部循環中對索引0處的值進行排序:

while (i > 0 && array[i] > key)

應該:

while (i >= 0 && array[i] > key) // note you are using a[i + 1] = a[1]
//        ^^                     // but not i - 1

另外,

掃描數組值時,可以在scanf的格式字符串中刪除\\t 只需使用scanf("%d", &array[i]); 如果您在scanf格式字符串中使用\\t ,它將消耗任意數量的空格,直到您不輸入非空格字符。

scanf的手冊說,

一系列空格字符(空格,制表符,換行符等;請參見isspace(3) )。 此偽指令匹配輸入中任何數量的空格,包括無空格。

還有一件事是您不需要從排序函數返回數組地址,因為您正在傳遞地址,因此排序函數所做的更改將反映在main 雖然這不是一個錯誤。 關鍵是您是通過array[i]而不是result[i]打印數組。

如果您糾正了上述錯誤,那么您的代碼應該可以正常運行:在此處@ 鍵盤檢查(我將main()更改為int main()並返回0但這是另一回事)。

通過使用調試器逐步執行程序,可以解決大多數問題。 您越早學會使用調試器就越好-它會一遍又一遍地幫助您。

例如,如果您在for()循環的開始處暫停了該程序,然后逐步執行,則可以看到發生了什么:

 array[j] = key;

假設您了解算法,您將期望key成為輸入列表中的第二個值。 您會驚訝地發現key從其初始值(0或任意數字,取決於您的C環境)沒有改變,而array[j]改變了。 然后您將意識到自己的錯誤:

 key = array[j];

繼續使用調試器逐步執行程序,您可能還會發現其他問題。


您提到您“認為將數組返回到main()會出現問題”。

實際上,您的iSort()函數始終返回傳遞給它的數組。 int *int[]都是指向int的指針。

所以iSort()

  • 接受一個指向數組開頭的指針
  • 修改該數組的內容
  • 返回相同的指針

您的main

  • 創建並填充array
  • array傳遞給iSort()
  • 獲取由iSort()返回的result
  • 忽略result並打印array

..但由於resultarray相等-指向同一數組開頭的兩個指針都沒有關系。

沒有理由(除了樣式選擇)為何iSort()不能是void函數。

由於您忽略result因此沒有理由存在它。 只需iSort()調用iSort()

iSort(array, size);

有些人喜歡提供一個指示,表示他們故意忽略了函數調用的結果:

(void) iSort(array, size);
#include<stdio.h>

int *isort(int array[], int size)
{

int i, j, key;

       for (j = 1; j < size; j++) {

           key = array[j] ;

           i = j - 1;

             while ((array[i] > key) && (i >= 0) ) {

               array[i + 1] = array[i];

                 i--;

         }

         array[i + 1] = key;

     }

    return array;

 }


int main()

{

    int array[100], size, i, *result;

    printf("\nSIZE: ");

    scanf("%d", &size);

    printf("\nARRAY: ");

    for (i=0; i<size ; i++)
        scanf("%d", &array[i]);

    result = isort(array, size);

    for (i=0; i<size; i++)
        printf("%d\n", array[i]);
} 
int *isort(int array[], int size)
{
    int i, j, tmp;
    for (j = 1; j < size; j++) {
        i = j ;
        while (i > 0 && array[i-1] > array[i]) {
            tmp = array[i];
                array[i] = array[i - 1];
                array[i - 1] = tmp;
                i--;  
        }
    }
    return array;
}   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM