簡體   English   中英

使用指針在C中對數組進行排序

[英]Sorting an array in C using pointers

我正在嘗試使用指針對浮點值數組進行排序。 我似乎無法理解為什么我的 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;
}

簡而言之,犯了三個大錯誤:

  1. 增加ptr_1而不是將其重置為 f_array
  2. 使用k+1k=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²) 排序,只需選擇選擇排序:減少交換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM