c - 使用动态内存的插入排序
问题描述
我不知道如何将参数传递给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
处理输入或匹配失败的方式,在与(或家人)一起接受输入时尤其如此。当任何一种情况发生时,都不会读取更多字符,并且输入缓冲区中的任何违规字符都不会被读取 - 只是在等待下次尝试读取时再次咬你(如果你在循环中接受输入,通常会导致无限循环)
(这是推荐使用POSIX等面向行的函数来获取用户输入的主要原因之一)fgets
getline
scanf
可以使用,如果使用正确。这意味着您有责任检查每次退货。你必须处理三个条件scanf
(return == EOF)
EOF
用户通过按Ctrl+d(或在 windows 上Ctrl+z,但请参阅CTRL+Z 在 Windows 10 中不生成 EOF )生成手册来取消输入;(return == expected No. of conversions)
表示读取成功——然后由您来检查输入是否满足任何附加条件(例如正整数、正浮点等);和- 否则,您必须处理匹配或输入失败,并且必须考虑输入缓冲区中可能留下的每个字符。(通常您将在输入缓冲区中向前扫描,直到发现 a
'\n'
orEOF
丢弃任何剩余的无关字符)
如果你做你的工作,你可以成功地scanf
根据需要使用。
推荐阅读
- macos - PS1 env 无法在新的 mac Catalina 上解析
- javascript - 使用 react-snap 后视频不会自动播放
- python - Python 错误 - 无法重定向设置的 url
- php - 如果在两个整数之间显示文本问题
- hibernate - Spring + Hibernate:无法加载应用程序上下文(无法确定类型:java.util.Set ...)
- regex - 正则表达式匹配任何大于 1080 的整数?
- slim - 错误 404:在 plesk 共享主机上部署 slim 框架 rest API 时
- javascript - 如何获取 Web 响应以用作 HTML/JavaScript 中的变量
- vba - 自动删除取消的会议
- html - 在 R 中进行网络抓取时如何修复 HTTP 403 错误?