c - 使用指针对C中的数组进行排序
问题描述
我正在尝试使用指针对浮点值数组进行排序。我似乎无法理解为什么我的 for 循环不对值进行排序。我已经尝试过调试,似乎这个程序一直运行到我实际进行排序的第三个 for 循环。
#include <stdio.h>
#pragma warning(disable : 4996)
int main() {
float f_array[20] = { 0.25, 0.93, 0.66, 0.74, 0.34, 0.36, 0.63, 0.00, 0.01, 0.50, 0.33, 0.47, 0.31, 0.51, 0.64, 0.55, 0.61, 0.62, 0.57, 0.66 };
float* ptr_1 = f_array;
int i, j, k;
for (i = 0; i < 20; i++) {
printf("Unsorted values: %f\n", *ptr_1);
printf("\n");
ptr_1++;
}
for (j = 0; j < 20; j++) {
for (k = 0; k < 20; k++)
{
if (*(ptr_1 + k) > (*(ptr_1 + (k + 1)))) {
k = *(ptr_1 + k);
*(ptr_1 + k) = *(ptr_1 + (k + 1));
*(ptr_1 + (k + 1)) = k;
}
}
}
for (i = 0; i < 20; i++) {
printf("Sorted Values: %f\n", *ptr_1);
printf("\n");
ptr_1++;
}
return 0;
}
解决方案
我想首先告诉您,您对指针与数组的了解太少了。但我知道你不会听,所以我会先修复你的代码:
#include <stdio.h>
int main(void)
{
float f_array[20] = { 0.25, 0.93, 0.66, 0.74, 0.34, 0.36, 0.63, 0.00, 0.01, 0.50, 0.33, 0.47, 0.31, 0.51, 0.64, 0.55, 0.61, 0.62, 0.57, 0.66 };
float* ptr_1 = f_array;
int i, j, k;
for (i = 0; i < 20; i++) {
printf("Unsorted values: %f\n", *ptr_1);
ptr_1++;
}
ptr_1 = f_array;
for (j = 0; j < 20; j++) {
for (k = 0; k < 19; k++) {
if (*(ptr_1 + k) > (*(ptr_1 + (k + 1)))) {
float tmp = *(ptr_1 + k);
*(ptr_1 + k) = *(ptr_1 + (k + 1));
*(ptr_1 + (k + 1)) = tmp;
}
}
}
ptr_1 = f_array;
for (i = 0; i < 20; i++) {
printf("Sorted Values: %f\n", *ptr_1);
ptr_1++;
}
return 0;
}
简而言之,犯了三个大错误:
- 递增
ptr_1
而不是将其重置为 f_array k+1
与_k=20
k
用作临时变量来交换两个浮点数...这会在 Visual Studio 中触发警告:warning C4244: '=': conversion from 'float' to 'int', possible loss of data
.
此代码仍会生成warning C4305: 'initializing': truncation from 'double' to 'float'
,因为您使用双精度来初始化数组。你为什么要使用浮点数?在 64 位时代,浮点的默认值应该是 double,除非你真的需要节省内存。
不要默认禁用警告而不考虑:为什么#pragma warning(disable : 4996)
?这是什么意思?需要吗?
最后,请记住,当您编写代码时,f_array[k]
您使用的是指针运算符[]
。f_array
被视为指向数组第一个元素的指针。这意味着*(f_array + k)
。使用指针并不意味着您需要指向第一个元素并递增指针。这就是为什么我在指针之后引入数组。
您可以编写ptr_1[k]
并且ptr_1[k+1]
仍然使用指针。而且,在我看来,您在编写f_array[k]
. 但其他一些导师会不同意。
最后一条评论:我讨厌这种排序(它是没有提前停止可能性的冒泡排序吗?)而且我没有检查它是否正确。如果您想要简单的 O(n²) 排序,只需选择选择排序:减少交换。
推荐阅读
- vue.js - 无法弄清楚 vue-router 是如何工作的
- intellij-idea - 当程序在 IntelliJ 中运行时,为什么我会收到 SSLHandshakeException 作为 JAR?
- c# - Selecting Tuples from ILookup throws exception
- hadoop - 不允许用户冒充匿名 (state=08S01,code=0) org.apache.hadoop.security.authorize.AuthorizationException
- python - PyQt5中的Qscrollbar没有显示
- c# - ASP.NET Core - 初级课程 - 剃刀页面重定向时,数据库不会保存对数据库的更改
- angular - Angular 7,从日期输入中减去日历天数
- java - 有没有办法随机化哪个 if 语句在 Java 中运行第一、第二、第三、第四等等?
- jquery - Laravel Echo - 未捕获的类型错误:无法读取未定义的属性“通道”
- git - 如何统一分支之间的文件权限差异?