C:指向数组的指针和破坏性排序

C:指向数组的指针和破坏性排序,c,arrays,sorting,pointers,bubble-sort,C,Arrays,Sorting,Pointers,Bubble Sort,我写了一段简短的代码。它有两个函数:bubbleSort是一个气泡排序函数(从最小到最大),而“int main”用于使用大小为5的int数组测试这段代码 我希望这是对数组进行破坏性排序,而不是简单地传递副本。我看了又看,但我仍然不完全清楚这应该如何工作。我错过了什么 #include <stdio.h> void bubbleSort(int values[], int n); int main(void) { //set simple test array to make s

我写了一段简短的代码。它有两个函数:bubbleSort是一个气泡排序函数(从最小到最大),而“int main”用于使用大小为5的int数组测试这段代码

我希望这是对数组进行破坏性排序,而不是简单地传递副本。我看了又看,但我仍然不完全清楚这应该如何工作。我错过了什么

#include <stdio.h>

void bubbleSort(int values[], int n);

int main(void) {
//set simple test array to make sure bubbleSort works
    int arr[5] = {5,4,3,2,1};
//run it through function, and then print the now sorted array to make sure
    bubbleSort(arr, 5);
    printf("%i", arr);
    return 0;
}


void bubbleSort(int values[], int n)
{
    for (int i = 0; i < n; i++) { 
        for (int j = 0, hold = 0; j < n-i; j++) {
            if (values[j] > values[j+1]) {
                hold = values[j+1];
                values[j+1] = values[j];
                values[j] = hold;
            }
        }
    }
    return;
}
#包括
void bubbleSort(int值[],int n);
内部主(空){
//设置简单测试数组以确保bubbleSort工作
int-arr[5]={5,4,3,2,1};
//通过函数运行它,然后打印现在已排序的数组以确保
气泡运动(arr,5);
printf(“%i”,arr);
返回0;
}
void bubbleSort(int值[],int n)
{
对于(int i=0;i值[j+1]){
保持=值[j+1];
值[j+1]=值[j];
值[j]=保持;
}
}
}
回来
}
注意:我的代码的其余部分在我的业余编程头脑中看起来很好,但请给我一些建议,说明我可以改进什么,什么可以更好,等等。我曾考虑过使用递归进行冒泡排序,但我还没有像我想实现的那样熟悉C。不过,如果你有建议,我会非常乐意阅读


谢谢

看起来您的函数正在对数组进行排序(尽管有一些bug),而您只是错误地打印了结果。printf不知道如何打印数组。相反,您需要使用循环一次打印一个整数:

for(int i=0; i<5; i++){
  printf("%d ", arr[i]);
}
printf("\n");

for(int i=0;i您的代码已经对数组进行了适当的排序-尽管其中有一个bug。我将只讨论问题的主题(在C中对数组进行适当排序),因为注释已经用排序函数突出了这些bug

结果的打印输出不正确,尽管它试图将
arr
指针打印为整数:

sort.c:10:18: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]
    printf("%i", arr);
            ~~   ^~~
1 warning generated.
但是,将此更改为:

    for (int i = 0; i < 5; i++)
        printf("%i", arr[i]);
for(int i=0;i<5;i++)
printf(“%i”,arr[i]);
修复了输出的问题


也许你的困惑是因为数组实际上是一种访问C语言中指针的语法方式。
arr
是指针。
arr[1]
*(arr+1)
相同(指针的内容
arr+1
使用指针算术,指针算术按
sizeof
类型递增)。因此,当您将
arr
传递到函数中时,您将传递一个指向现有数组的指针,然后您将修改其内容,对数组进行适当排序。

气泡排序代码中有一个问题必须解决。您的内部循环存在以下问题:

/* for (int j = 0, hold = 0; j < n-i; j++) { */  // ISSUE here
for (int j = 0, hold = 0; j < n-i-1; j++) { // j < n-i-1 should be the condition
而且,尽管与排序函数无关,正如其他人指出的,
printf(“%i”,arr);
是错误的,并且将调用
未定义的行为
,因为您在
printf
中使用了错误的格式说明符。似乎您正在尝试打印数组。为此,您可以执行以下操作:

// printf("%i", arr);
for (int i = 0; i < 5; i++)
    printf("%d ", arr[i];)
printf("\n");
//printf(“%i”,arr);
对于(int i=0;i<5;i++)
printf(“%d”,arr[i];)
printf(“\n”);

“就地排序”会是一个更好的名称…
printf(“%i”,arr);
是错误的,您必须打印数组的一个元素,即
arr[0]
,而不是数组本身。
n-i
可以,但第一个循环应该从
i=1
开始。如果
i
是0,则内部循环是
(j=0;jOr)并完全消除其中一个索引变量。幸运的是,数组结束后的值大于5。请尝试
int arr[]={5,4,3,2,1,0}
同时保持代码的其余部分不变。我使用的5是数组中的元素数。如果数组有6个元素,则显然需要使用6。理想情况下,您可以将元素数存储在变量中或
#define
以避免到处重复元素数。关键是排序例程具有未定义的行为,它访问超出数组末尾的部分。通过使数组变大,并且不告诉排序例程数组变大,您可以控制超出数组末尾的值,并证明排序已中断。是的,看起来是这样。如果@ozymandias1正在读取此内容,我建议检查您的再次使用book(甚至wikipedia)来实现正确的bublesort算法。sps,非常感谢您花时间写出这篇详细而透彻的回复。非常感谢您的帮助和好意。谢谢!不知道arr是指针,非常感谢您的帮助。
// printf("%i", arr);
for (int i = 0; i < 5; i++)
    printf("%d ", arr[i];)
printf("\n");