我正在嘗試用 C 撰寫一個基本的選擇排序程式。通過除錯,我可以看到在第一個 for 回圈(//交換值)下,selection(nums, size, i).index回傳與i. 但是,如果我在 for 回圈之外使用完全相同的代碼selection呼叫該函式,它將正確回傳索引(陣列中具有最小值和給定索引右側的數字的索引)。
如何selection在 for 回圈中回傳正確的值?
#include <stdio.h>
typedef struct {
int value;
int index;
} sorted;
sorted selection(int integers[], int size, int idx);
int main(void) {
int nums[] = {7, 2, 3, 0, 1, 4, 6, 5};
int size = sizeof(nums)/sizeof(int);
int temp;
// Swap the values
for (int i = 0; i < size; i ) {
temp = nums[i];
nums[i] = selection(nums, size, i).value;
nums[selection(nums, size, i).index] = temp;
}
// Print the array
printf("[");
for (int j = 0; j < size; j ) {
if (!(j == size - 1)) {
printf("%i ", nums[j]);
}
else {
printf("%i", nums[j]);
}
}
printf("]\n");
}
sorted selection(int arr[], int size, int start) {
sorted smallest;
for (int i = start; i < size; i ) {
// If first element
if (i == start) {
smallest.value = arr[i];
smallest.index = i;
}
// If smaller
else if (arr[i] < smallest.value) {
smallest.value = arr[i];
smallest.index = i;
}
}
return smallest;
}
uj5u.com熱心網友回復:
您的版本失敗的原因是您selection在開始修改陣列后第二次呼叫,而第一次呼叫后只需要保留索引。
正如@WhozCraig 指出的那樣,使用sortedand是完全沒有必要的。selection您還sorted按值傳遞,這不是 C 中的約定。
我已重命名該函式以表明其用途。這可以簡化為只取當前索引右側的元素,但這需要在處理回傳值時進行一些額外的調整,因此需要權衡取舍。
#include <stdio.h>
int indexOfSmallest(int integers[], int size, int idx);
int main(void) {
int nums[] = {7, 2, 3, 0, 1, 4, 6, 5};
int size = sizeof(nums)/sizeof(int);
int temp;
// Swap the values
for (int i = 0; i < size; i ) {
temp = nums[i];
int smallest = indexOfSmallest(nums, size, i);
nums[i] = nums[smallest];
nums[smallest] = temp;
}
// Print the array
printf("[");
for (int j = 0; j < size; j ) {
if (!(j == size - 1)) {
printf("%i ", nums[j]);
}
else {
printf("%i", nums[j]);
}
}
printf("]\n");
}
int indexOfSmallest(int arr[], int size, int start) {
int smallest = start;
for (int i = start; i < size; i ) {
if (arr[i] < arr[smallest]) {
smallest = i;
}
}
return smallest;
}
uj5u.com熱心網友回復:
您需要更改回圈“//交換值”
// Swap the values
for (int i = 0; i < size; i )
{
sorted select = selection(nums, size, i);
temp = nums[i];
nums[i] = select.value;
nums[select.index] = temp;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/486414.html
