首页 > 解决方案 > 使用动态内存的插入排序

问题描述

我不知道如何将参数传递给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]);
}

标签: cdynamic

解决方案


让我们一次拿这个。首先,您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处理输入匹配失败的方式,在与(或家人)一起接受输入时尤其如此。当任何一种情况发生时,都不会读取更多字符,并且输入缓冲区中的任何违规字符都不会被读取 - 只是在等待下次尝试读取时再次咬你(如果你在循环中接受输入,通常会导致无限循环)

(这是推荐使用POSIX等面向行的函数来获取用户输入的主要原因之一)fgetsgetline

scanf可以使用,如果使用正确。这意味着有责任检查每次退货。你必须处理三个条件scanf

  1. (return == EOF)EOF用户通过按Ctrl+d(或在 windows 上Ctrl+z,但请参阅CTRL+Z 在 Windows 10 中不生成 EOF )生成手册来取消输入;
  2. (return == expected No. of conversions)表示读取成功——然后由您来检查输入是否满足任何附加条件(例如正整数、正浮点等);和
  3. 否则,您必须处理匹配输入失败,并且必须考虑输入缓冲区中可能留下的每个字符。(通常您将在输入缓冲区中向前扫描,直到发现 a '\n'orEOF丢弃任何剩余的无关字符)

如果你做你的工作,你可以成功地scanf根据需要使用。


推荐阅读