C中的冒泡排序:函数不改变数组数据
Bubble sort in C: Function not changing array data
代码:
#include <stdio.h>
void testSort(int values[], int n);
int main(void)
{
int hs[] = {5,3,2,1,4};
printf("Unsorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]);
testSort(hs, 5);
printf("Sorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]);
}
void testSort(int values[], int n)
{
for (int i = 0; i < n-1; i++)
{
int hold;
int current = values[i];
int next = values[i + 1];
if (current > next)
{
hold = current;
current = next;
next = hold;
}
}
return;
}
我正在尝试进行冒泡排序,现在它通过数组一次,但我的问题是:为什么我的 hs[]
在调用函数后没有更新?第二个 printf
表明它保持不变。
编辑:
如前所述,事实证明我 是 更改数据但是 副本 。出于某种原因,当我创建变量 current/next
时,我觉得它们好像 代表 values[i]/values[i+1]
但实际上我只是在创建新变量并传递 [= values[0]
的 23=]value 为 5 并将其分配给 current
。显然保持 values[] 不变。谢谢大家
请尝试以下代码:-
void bubble_sort(int list[], int n){
int c, d, t;
for (c = 0 ; c < ( n - 1 ); c++)
{
for (d = 0 ; d < n - c - 1; d++)
{
if (list[d] > list[d+1])
{
t = list[d];
list[d] = list[d+1];
list[d+1] = t;
}
}
}
}
问题是您只修改了函数的局部变量,而不是数组的元素。
这和为什么这个程序会打印1
而不是2
是一样的原理:
int main()
{
int array[] = {1};
int x = array[0];
x = 2;
printf("array[0] = %d\n", array[0]);
return 0;
}
您需要为数组的元素赋值:
void testSort(int values[], int n)
{
for (int i = 0; i < n-1; i++)
{
if (values[i] > values[i+1])
{
int hold = values[i];
values[i] = values[i+1];
values[i+1] = hold;
}
}
}
修复此问题后,您会注意到此功能仅适用于某些输入。
解决该错误留作练习。
代码:
#include <stdio.h>
void testSort(int values[], int n);
int main(void)
{
int hs[] = {5,3,2,1,4};
printf("Unsorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]);
testSort(hs, 5);
printf("Sorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]);
}
void testSort(int values[], int n)
{
for (int i = 0; i < n-1; i++)
{
int hold;
int current = values[i];
int next = values[i + 1];
if (current > next)
{
hold = current;
current = next;
next = hold;
}
}
return;
}
我正在尝试进行冒泡排序,现在它通过数组一次,但我的问题是:为什么我的 hs[]
在调用函数后没有更新?第二个 printf
表明它保持不变。
编辑:
如前所述,事实证明我 是 更改数据但是 副本 。出于某种原因,当我创建变量 current/next
时,我觉得它们好像 代表 values[i]/values[i+1]
但实际上我只是在创建新变量并传递 [= values[0]
的 23=]value 为 5 并将其分配给 current
。显然保持 values[] 不变。谢谢大家
请尝试以下代码:-
void bubble_sort(int list[], int n){
int c, d, t;
for (c = 0 ; c < ( n - 1 ); c++)
{
for (d = 0 ; d < n - c - 1; d++)
{
if (list[d] > list[d+1])
{
t = list[d];
list[d] = list[d+1];
list[d+1] = t;
}
}
}
}
问题是您只修改了函数的局部变量,而不是数组的元素。
这和为什么这个程序会打印1
而不是2
是一样的原理:
int main()
{
int array[] = {1};
int x = array[0];
x = 2;
printf("array[0] = %d\n", array[0]);
return 0;
}
您需要为数组的元素赋值:
void testSort(int values[], int n)
{
for (int i = 0; i < n-1; i++)
{
if (values[i] > values[i+1])
{
int hold = values[i];
values[i] = values[i+1];
values[i+1] = hold;
}
}
}
修复此问题后,您会注意到此功能仅适用于某些输入。
解决该错误留作练习。