c - 使用动态内存的插入排序

标签 c dynamic

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

我想要这样的动态数组:enter image description here

#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返回。您必须处理三个条件

  1. (return == EOF) 用户通过按 Ctrl+d(或在 Windows 上EOF 来取消输入>Ctrl+z,但请参阅 CTRL+Z does not generate EOF in Windows 10 );
  2. (return == Expected No. of conversions) 表示读取成功 - 然后由您检查输入是否满足任何其他条件(例如正整数、正 float ) , ETC..);和
  3. 否则,您必须处理匹配输入失败,并且必须考虑可能留在输入缓冲区中的每个字符。 (通常,您将在输入缓冲区中向前扫描,直到发现 '\n'EOF 为止,并丢弃剩余的任何无关字符)

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

关于c - 使用动态内存的插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778453/

相关文章:

c - 位数组的问题

c - 消息的 Adler32 + adler 总和是否为零(如 CRC32)

python - 动态更新ModelForm的Meta类模型字段

java - 如何填充动态列表 Java

c - C 中的 "&&"和 "and"运算符

c - UNIX C编程输入重定向命令

c - 为什么这里需要在函数中有 if 语句才能工作?

c++ - 使用共享库中的多态对象安全吗?

c - hashmap 的动态数组访问冲突

c - 通用动态数组未正确更新属性