C语言实现冒泡排序

  很久已经没有弄过和C语言相关的东西了,最近开始复习数据结构和算法。我这边实现了冒泡排序算法,代码如下:

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

void swapA(int A[], int i, int j){
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp;
}

void bubbleSort(int A[],int n){
    for (int j = 0; j< n -1; j++) {
        for (int i = 0; i < n-1 -j; i++) {
            if ( A[i]> A[i+1]) {
                swapA(A, i, i+1);
            }
        }
    }
}


调用的代码如下:

 int A[] = {9,7,11,3,4,1,0};
    int n = sizeof(A)/sizeof(int);
    bubbleSort(A,n);
    printfArray(A,n);

其中有个疑问,数组作为参数,无法在自定义函数内计算数组中元素的数量
通过搜索发现原因:
1)数组作为函数的实参传递,传递的数组的首地址,所以自定义函数操作形参就是在操作实参数了,数组的传递一般都是地址传递,除非操作单个数组元素,只传一个值(例如传递a[0]),就是值传递,传递数组名称a就是地址传递,数组名称本来就是一个指针常量,所以你要传递数组时声明自定义函数时声明形参时数组的那个形式参数是声明为指针的。
2)形参其实就是一个指针,即使你定义的形参是int array[],编译器也是将其看成指针。
如果将数组作为实参传给自定义函数,那么自定义形参(指针)就指向了数组的首地址(因为传递的时候是数组名),那么在自定义函数里所有的修改,都是修改原数组的内容。所以,自定义函数处理结束后,原数组的数据也就变化了。
参考地址:https://bbs.csdn.net/topics/392172200

冒泡排序注释:

// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(n^2)
// 最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
// 平均时间复杂度 ---- O(n^2)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 稳定

更多优质文章,可以微信扫码关注:
C语言实现冒泡排序_第1张图片

你可能感兴趣的:(C语言,数据结构,and,算法,数据结构,and,算法)