[英]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
..但由於result
和array
相等-指向同一數組開頭的兩個指針都沒有關系。
沒有理由(除了樣式選擇)為何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.