C语言指针(适合C语言进阶者):一道题带你深入理解数组与指针的关系

🎈个人主页:JAMES别扣了

💕在校大学生一枚。对IT有着极其浓厚的兴趣
✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享.
😍希望我的文章对大家有着不一样的帮助,欢迎大家关注我,我也会回关,大家一起交流一起互动,感谢大家的多多支持哈!

🎉欢迎 👍点赞✍评论⭐收藏

前言 

上文我们已经了解了数组和指针之间不一般的关系,相信读者们对于C语言的理解又更加深上一层楼,本文的主要目的是为上文的内容做一个适要的总结,以及介绍一个经典指针与数组结合的题目,更好地让读者们理解深层次的指针,这篇文章适合对C语言有一定基础的读者,基础薄弱的读者和C语言初学者可以翻阅本博主以往C语言系列文章,感谢您的关注,点赞,评论,祝大家的技术日益增长!!!

 往期高质量C语言文章(94+质量分):

C语言指针与数组(不适合初学者版):一篇文章带你深入了解指针与数组!-CSDN博客

C语言指针(下):一篇文章让你秒懂基础!(5000字)-CSDN博客 

C语言指针(上):一篇文章让你秒懂基础!-CSDN博客

C语言数组:一篇文章让你秒懂基础!-CSDN博客

冒泡排序

方法1:

#include <stdio.h>  
  
void bubble_sort(int arr[], int sz) {  
    int i, j;  
    for (i = 0; i < sz - 1; i++) {  
        for (j = 0; j < sz - i - 1; j++) {  
            if (arr[j] > arr[j + 1]) {  
                int tmp = arr[j];  
                arr[j] = arr[j + 1];  
                arr[j + 1] = tmp;  
            }  
        }  
    }  
}  
  
int main() {  
    int arr[] = {3, 1, 7, 5, 8, 9, 0, 2, 4, 6};  
    int sz = sizeof(arr) / sizeof(arr[0]);  
    bubble_sort(arr, sz);  
    for (int i = 0; i < sz; i++) {  
        printf("%d ", arr[i]);  
    }  
    return 0;  
}

冒泡函数

1.void bubble_sort(int arr[], int sz): 这是一个名为bubble_sort的函数,它接受一个整数数组arr和一个整数sz(数组的大小)作为参数。
2.int i, j;: 定义了两个循环计数器i和j。
3.外层循环for (i = 0; i < sz - 1; i++): 这个循环负责确保所有元素都至少被比较一次。因为每经过一次外层循环,最大的元素就会被冒泡到它应该在的位置(数组的末尾),所以每次可以减少一次内层循环的比较。
4.内层循环for (j = 0; j < sz - i - 1; j++): 这个循环负责比较相邻的元素,并根据需要交换它们的位置。
if (arr[j] > arr[j + 1]): 这个条件语句检查当前元素是否大于其相邻的下一个元素。
如果条件为真,就交换这两个元素的位置。、

主函数

1.int arr[] = {3, 1, 7, 5, 8, 9, 0, 2, 4, 6};: 定义了一个整数数组arr并初始化了一些值。
2.int sz = sizeof(arr) / sizeof(arr[0]);: 计算数组arr的大小,并将其存储在变量sz中。
3.bubble_sort(arr, sz);: 调用bubble_sort函数对数组arr进行排序。
4.for (int i = 0; i < sz; i++): 这是一个简单的循环,用于打印排序后的数组。
5.printf("%d ", arr[i]);: 打印数组中的当前元素。
6.return 0;: 表示程序正常结束。

方法2:

//⽅法2 - 优化
 
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
 
{
    int i = 0;
    for(i=0; i<sz-1; i++)
    {
        int flag = 1;//假设这⼀趟已经有序了
 
        int j = 0;
        for(j=0; j<sz-i-1; j++)
        {
            if(arr[j] > arr[j+1])
            {
                flag = 0;//发⽣交换就说明,⽆序
 
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
        if(flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了
 
            break;
    }
 }
 int main()
 {
    int arr[] = {3,1,7,5,8,9,0,2,4,6};
    int sz = sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr, sz);
    for(i=0; i<sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
 }

方法2:(优化) 

1. 引入优化变量 flag

在外部循环的开头,引入了一个名为 flag 的变量,并初始化为1。这个变量用来表示当前这趟遍历中是否发生了交换。

2. 内部循环


在内部循环中,如果检测到相邻的两个元素是逆序的(即 arr[j] > arr[j+1]),则执行交换操作,并将 flag 设置为0,表示发生了交换。

if(arr[j] > arr[j+1])  
{  
    flag = 0; // 发生交换就说明,未序  
    int tmp = arr[j];  
    arr[j] = arr[j+1];  
    arr[j+1] = tmp;  
}

3. 检查 flag


在内部循环结束后,检查 flag 的值。如果 flag 仍然是1,说明在这趟遍历中没有发生任何交换,数组已经是有序的,此时可以提前终止排序。

if(flag == 1) // 这趟没交换就说明已经有序,后续无需排序了  
    break;

4. main 函数


在 main 函数中,首先定义了一个整数数组 arr,然后计算数组的长度 sz,接着调用 bubble_sort 函数进行排序,最后使用循环遍历数组并打印排序后的结果.

int main()  
{  
    int i; // 声明变量 i  
    int arr[] = {3,1,7,5,8,9,0,2,4,6};  
    int sz = sizeof(arr)/sizeof(arr[0]);  
    bubble_sort(arr, sz);  
    for(i=0; i<sz; i++)  
    {  
        printf("%d ", arr[i]);  
    }  
    return 0;  
}

5.总结


这个优化版本的冒泡排序算法通过减少不必要的遍历次数来提高性能。如果数组已经部分有序,或者在排序过程中很快就变得有序,那么这个优化可以显著减少算法的运行时间。然而,如果数组几乎完全逆序,那么优化版本和标准版本的性能差异将不会太大

总结

冒泡排序是一种简单直观的排序算法,但是其时间复杂度较高,不适用于大数据集。然而,通过引入标志位进行优化,我们可以在保持算法简单性的同时,提高其处理大数据集的效率。

在编写代码时,我们应该注意代码的可读性和可维护性,尽量使用简洁明了的注释来解释代码的功能和实现方式。同时,我们也需要关注算法的时间复杂度和空间复杂度,以便在实际应用中选择最合适的排序算法。

总的来说,冒泡排序虽然简单,但是通过优化方法,我们可以使其在处理特定数据集时更加高效。对于初学者来说,理解并掌握冒泡排序及其优化方法,有助于他们更好地理解和掌握排序算法的基本原理和应用技巧。

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值