我不知道如何将参数传递给insertSort
。我也不确定我是否正确使用 scanf
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void insertSort(int LENGTH, int *arr)
{
int temp;
for(int i=0; i<LENGTH; i++)
{
temp = arr[i];
for(int j=i+1; j<LENGTH; j++)
{
if( temp > arr[j] )
{
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
int LENGTH = 10;
int *arr = malloc(sizeof(int)*LENGTH); //create dynamic memory
memset(arr, 0, LENGTH); //initialize the space
printf("please enter nums length : %d\n", LENGTH);
for(int i=0; i<LENGTH; i++) //put numbers to the dynamic space
{
printf("%d index : ", i);
scanf("%d", &arr[i]);
}
for(int i=0; i<LENGTH; i++) //print those space
printf("%3d", arr[i]);
insertSort(&LENGTH, &arr); //SORT !
for(int i=0; i<LENGTH; i++)
printf("%3d", arr[i]);
}
最佳答案
让我们一次只看这一篇。首先,您的 insertSort
不是插入排序。插入排序实现如下所示:
void insertSort(int LENGTH, int *arr)
{
for (int i = 1; i < LENGTH; i++)
{
int tmp = arr[i], j;
for (j = i; j >= 1 && tmp < arr[j-1]; j--)
arr[j] = arr[j-1];
arr[j] = tmp;
}
}
接下来,当您测试函数等时,放弃用户输入,只使用一组固定的数据作为测试用例来测试您的函数,例如
int main(void) {
int arr[] = { 10, 2, 8, 5, 4, 6, 7, 3, 9, 1 },
nmemb = (int)(sizeof arr/sizeof *arr);
insertSort (nmemb, arr);
for (int i = 0; i < nmemb; i++)
printf ("%3d", arr[i]);
putchar ('\n');
}
最后,scanf
。除非您验证其返回,否则您无法开始正确使用scanf
。此外,在您的情况下,如果用户输入 "ten"
而不是数字 10
会发生什么 - 尝试一下...
每当您接受用户输入时,您都必须考虑输入缓冲区(此处为stdin
)中保留的每个字符。由于 scanf
处理输入或匹配的方式,使用 scanf
(或系列)获取输入时尤其如此。失败。当发生任何一种情况时,不会再读取任何字符,并且任何有问题的字符都将在输入缓冲区中保持未读状态 - 只是等待在下一次尝试读取时再次咬住您(如果您这样做,通常会导致无限循环)在循环内获取输入)
(这是建议使用 面向行 的函数(例如 fgets
或 POSIX getline
)来获取用户输入的主要原因之一)
scanf
。这意味着您有责任每次检查scanf
的返回。您必须处理三个条件
(return == EOF)
用户通过按 Ctrl+d(或在 Windows 上EOF 来取消输入>Ctrl+z,但请参阅 CTRL+Z does not generate EOF in Windows 10 );(return == Expected No. of conversions)
表示读取成功 - 然后由您检查输入是否满足任何其他条件(例如正整数、正 float ) , ETC..);和- 否则,您必须处理匹配或输入失败,并且必须考虑可能留在输入缓冲区中的每个字符。 (通常,您将在输入缓冲区中向前扫描,直到发现
'\n'
或EOF
为止,并丢弃剩余的任何无关字符)
如果您完成了您的工作,您就可以根据需要成功使用 scanf
。
关于c - 使用动态内存的插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778453/