使用动态内存进行插入排序

时间:2018-08-10 03:20:03

标签: 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]);
}

1 个答案:

答案 0 :(得分:0)

让我们一次拿一件。对于初学者来说,您的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处理 input matching 失败的方式而使用scanf(或族)输入时,尤其如此。发生任何一种情况时,不再读取任何字符,并且在输入缓冲区中不读取任何令人讨厌的字符-只是等待在下一次尝试读取时再次咬住您(如果您遇到这种情况,通常会导致无限循环正在循环输入)

(这是建议使用fgets或POSIX getline之类的面向 line 的功能的主要原因之一)

如果正确使用,可以使用

scanf。这意味着负责每次检查scanf 退货。您必须处理三个条件

  1. (return == EOF)用户通过按 Ctrl + d (或在Windows Ctrl + z 上)生成手册EOF来取消输入CTRL+Z does not generate EOF in Windows 10);
  2. (return == expected No. of conversions)表示读取成功-然后由您检查输入是否满足任何其他条件(例如正整数,正浮点等);和
  3. 否则,必须处理 matching input 失败,并且必须考虑输入缓冲区中可能剩余的每个字符。 (通常,您将在输入缓冲区中向前扫描,直到找到'\n'EOF并丢弃所有剩余的多余字符为止)

完成工作后,可以根据需要成功使用scanf