[英]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;
}
簡而言之,犯了三個大錯誤:
ptr_1
而不是將其重置為 f_arrayk+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²) 排序,只需選擇選擇排序:減少交換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.