首页 > 解决方案 > 使用指针对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;
}

标签: csorting

解决方案


我想首先告诉您,您对指针与数组的了解太少了。但我知道你不会听,所以我会先修复你的代码:

#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;
}

简而言之,犯了三个大错误:

  1. 递增ptr_1而不是将其重置为 f_array
  2. k+1与_k=20
  3. 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²) 排序,只需选择选择排序:减少交换。


推荐阅读