C 使用动态内存的插入排序

C 使用动态内存的插入排序,c,dynamic,C,Dynamic,我不知道如何将参数传递给insertSort。我也不确定是否正确使用了scanf 我希望动态数组如下所示: #包括 #包括 #包括 void insertSort(int-LENGTH,int*arr) { 内部温度; 对于(int i=0;i让我们一次只取一个。首先,您的insertSort不是插入排序。插入排序实现如下所示: void insertSort(int LENGTH, int *arr) { for (int i = 1; i < LENGTH; i++)

我不知道如何将参数传递给
insertSort
。我也不确定是否正确使用了
scanf

我希望动态数组如下所示:

#包括
#包括
#包括
void insertSort(int-LENGTH,int*arr)
{
内部温度;

对于(int i=0;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;
    }
}
void insertSort(int-LENGTH,int*arr)
{
for(int i=1;i=1&&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');
}
int main(无效){
int arr[]={10,2,8,5,4,6,7,3,9,1},
nmemb=(int)(sizeof arr/sizeof*arr);
插入排序(nmemb,arr);
对于(int i=0;i
最后,
scanf
。除非验证其返回值,否则无法开始正确使用
scanf
。此外,在您的情况下,如果用户键入的是
“十”
而不是数字
10
,会发生什么情况?请尝试一下

任何时候进行用户输入时,必须考虑输入缓冲区中保留的每个字符(
stdin
),尤其是使用
scanf
(或系列)进行输入时由于
scanf
处理输入或匹配失败的方式。当任何一种情况发生时,都不会再读取更多字符,任何有问题的字符都会留在输入缓冲区中未读——只是等待下次尝试读取时再次咬你(如果你在循环中获取输入,通常会导致无限循环)

(这是建议使用面向行的函数(如
fgets
或POSIX
getline
)进行用户输入的主要原因之一)

如果使用正确,可以使用
scanf
。这意味着您每次都要负责检查
scanf
返回值。您必须处理三种情况

  • (return==EOF)
    用户通过按Ctrl+d(或windows Ctrl+z,但请参见)生成手动
    EOF来取消输入
  • (return==预期的转换次数)
    表示读取成功——然后由您检查输入是否满足任何附加条件(例如正整数、正浮点等);以及
  • 否则,您必须处理匹配或输入失败,并且必须说明可能留在输入缓冲区中的每个字符。(通常,您将在输入缓冲区中向前扫描,直到发现
    '\n'
    EOF
    丢弃任何剩余的无关字符)

  • 如果您完成了您的工作,您可以根据需要成功地使用
    scanf

    您的
    scanf
    使用看起来基本正常。
    insertSort()的参数
    不要。该函数需要一个
    int
    和一个
    int*
    。而是提供一个
    int*
    和一个
    int**
    。去掉参数列表中的
    &
    运算符。
    memset(arr,0,LENGTH)
    仅将
    arr
    的第一个
    10字节设置为零。您使用
    sizeof(int)*LENGTH
    进行分配,为什么不使用
    memset
    进行同样的操作呢?(不,如果您没有正确使用
    scanf
    ,则无法验证返回并处理(1)EOF,(2)匹配或输入失败,以及(3)良好的输入和(4)在上面(2)的情况下清空输入缓冲区)我像insertionSort(LENGTH,arr)和void insertionSort(int*LENGTH,int**arr)一样对它们进行了编辑,但出现了错误…^dynamic_sort.c:11:8:警告:赋值从指针生成整数而不使用强制转换[-Wint conversion]temp=arr[I];//和动态排序。c:41:21:警告:从不兼容的指针类型[-Wincompatible指针类型]insertSort(长度,arr);//排序!谢谢!非常有用,我将尝试编辑它们,但快速提问!对于(j=i;j>=1&&tmpj
    循环从
    i
    开始,然后是w从头到尾运行,直到找到
    tmp
    不正确的元素(意味着找到
    tmp
    大于
    arr
    的元素)并插入
    tmp
    arr[i]
    )。通过要求
    j>=1
    确保使用
    arr[j-1]
    测试的索引永远不小于
    0
    )@clearlight,它当然可以被分离,但这是为(j=i;…;j-)
    编写简单for循环
    的一种方便方法,您只需要两个条件来测试
    j>=1&&tmp
    。你可以单独使用
    j>=1
    ,然后在循环内测试
    如果(arr[j-1]
    。任何更清楚的都可以。@clearlight,是的,不用担心。我可以告诉你,我从89年起就在这些公司工作过(包括JSC、Rockwell Space Operations等)他们真的没有遵循一个行业标准。著名的短语“代码更像是一个指导原则的集合……”是什么意思?我更喜欢带有条件和函数等的“无拥抱”,在if(funcname)之间留有空格(
    而不是在预算内。干净易读是关键。我已经为m
    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');
    }