C中的气泡排序:函数不更改数组数据

C中的气泡排序:函数不更改数组数据,c,bubble-sort,C,Bubble Sort,代码: #包括 void testSort(int值[],int n); 内部主(空) { int hs[]={5,3,2,1,4}; printf(“未排序的:%i%i%i%i%i\n”、hs[0]、hs[1]、hs[2]、hs[3]、hs[4]); testSort(hs,5); printf(“已排序:%i%i%i%i%i\n”、hs[0]、hs[1]、hs[2]、hs[3]、hs[4]); } void testSort(int值[],int n) { 对于(int i=0;i下一个)

代码:

#包括
void testSort(int值[],int n);
内部主(空)
{
int hs[]={5,3,2,1,4};
printf(“未排序的:%i%i%i%i%i\n”、hs[0]、hs[1]、hs[2]、hs[3]、hs[4]);
testSort(hs,5);
printf(“已排序:%i%i%i%i%i\n”、hs[0]、hs[1]、hs[2]、hs[3]、hs[4]);
}
void testSort(int值[],int n)
{
对于(int i=0;i下一个)
{ 
保持=电流;
当前=下一个;
下一个=保持;
}
}
返回;
}
我正在尝试进行冒泡排序,现在它会遍历数组一次,但我的问题是:为什么调用函数后我的
hs[]
不更新?第二个
printf
显示它保持不变

编辑:
如前所述,结果是我在更改数据,但更改了副本的副本。出于某种原因,当我创建变量
current/next
时,我觉得它们似乎代表
值[I]/values[I+1]
,但实际上我只是创建了新变量,并传递
值[0]
的值,即5,然后将其分配给
current
。显然,保持值[]不变。谢谢大家

请尝试以下代码:-

#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;
}
void bubble\u排序(int list[],int n){
int c,d,t;
对于(c=0;c<(n-1);c++)
{
对于(d=0;d列表[d+1])
{
t=列表[d];
列表[d]=列表[d+1];
列表[d+1]=t;
}
}
}
}

请尝试以下代码:-

#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;
}
void bubble\u排序(int list[],int n){
int c,d,t;
对于(c=0;c<(n-1);c++)
{
对于(d=0;d列表[d+1])
{
t=列表[d];
列表[d]=列表[d+1];
列表[d+1]=t;
}
}
}
}

问题在于您只修改了函数的局部变量,而不是数组的元素

这与此程序为什么打印
1
而不打印
2
的原理相同:

 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;
             }
          }
     }
 }
您需要为数组的元素指定值:

int main()
{
    int array[] = {1};
    int x = array[0];
    x = 2;
    printf("array[0] = %d\n", array[0]);
    return 0;
}
void testSort(int值[],int n)
{
对于(int i=0;i值[i+1])
{ 
int hold=值[i];
值[i]=值[i+1];
值[i+1]=保持;
}
}
}
一旦您解决了这个问题,您会注意到这个函数只适用于某些输入。

解决这个bug只是一个练习。

问题在于您只修改了函数的局部变量,而不是数组的元素

这与此程序为什么打印
1
而不打印
2
的原理相同:

 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;
             }
          }
     }
 }
您需要为数组的元素指定值:

int main()
{
    int array[] = {1};
    int x = array[0];
    x = 2;
    printf("array[0] = %d\n", array[0]);
    return 0;
}
void testSort(int值[],int n)
{
对于(int i=0;i值[i+1])
{ 
int hold=值[i];
值[i]=值[i+1];
值[i+1]=保持;
}
}
}
一旦您解决了这个问题,您会注意到这个函数只适用于某些输入。

解决这个bug只是一个练习。

您需要将
值[i]
值[i+1]
交换。代码所做的一切就是交换
当前
下一个
中的副本。您的函数不会在任何地方修改
值[i]
。@如果您不能按值传递数组,它会衰减为指向其第一个元素的指针。函数不会更改数据,因为它不包含更改数据的代码。。。当然,您可以花点时间阅读自己的代码来解决这个问题。您需要将
值[i]
值[i+1]
交换。代码所做的一切就是交换
当前
下一个
中的副本。您的函数不会在任何地方修改
值[i]
。@如果您不能按值传递数组,它会衰减为指向其第一个元素的指针。函数不会更改数据,因为它不包含更改数据的代码。。。当然,你可以花一点时间阅读自己的代码来解决这个问题。在这里,一点解释可能会有所帮助。首先,你将尝试此代码并检查它是否有效。然后我将解释it@SarikaKoli:不,那是胡说八道。您正在提出更改代码的建议,因此应该立即解释它们,而不是在其他人验证解决方案是否正确之后。(顺便说一句,这是你作为answrer的工作:提供工作代码。无论是通过自信还是通过测试实际代码都无关紧要。)一点解释可能会有所帮助。首先,你将尝试此代码并检查它是否工作。然后我将解释it@SarikaKoli:不,那是胡说八道。您正在提出更改代码的建议,因此应该立即解释它们,而不是在其他人验证解决方案是否正确之后。(顺便说一句,这是你作为Answer的工作:提供工作代码。这是通过自信还是通过测试实际代码并不重要。)