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

这篇具有很好参考价值的文章主要介绍了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.总结


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

总结

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

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

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

到了这里,关于C语言指针(适合C语言进阶者):一道题带你深入理解数组与指针的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言:深入理解指针二】

    我们知道,指针变量也是变量,它也有自己的地址,使用什么来存放它的地址呢?答案是:二级指针。 关于二级指针的运算 *pp先解引用,对pp中的地址进行访问,访问的就是p **pp, 先通过*pp找到p,再对p进行解引用,访问的就是a 指针数组,顾名思义,它应该是一个数组,是用

    2024年02月04日
    浏览(112)
  • C语言——深入理解指针(3)

    目录 1. 字符指针 2. 数组指针 2.1 数组指针变量 2.2 数组指针变量的初始化 3.二维数组传参(本质) 4. 函数指针 4.1 函数指针变量的创建 4.2 函数指针的使用 4.3 typedef  5. 函数指针数组 6. 转移表(函数指针数组的使用) 在指针的类型中有一种指针类型为字符指针  char*    举例

    2024年02月05日
    浏览(56)
  • C语言深入理解指针(非常详细)(四)

    字符指针在之前我们有提到过,(字符)(指针)前面的字符代表着存储的元素为字符类型,而指针则是表示这存储的方式。 写法为char * 一般使用的方式如下: 还有一种使用方式如下: 值得注意的是: 代码 const char pstr = “hello jack.”; 特别容易以为是把字符串 hello jack 放到

    2024年02月09日
    浏览(61)
  • 【C语言基础】:深入理解指针(三)

    指针系列回顾 : 【C语言基础】:深入理解指针(一) 【C语言基础】:深入理解指针(二) 一、冒泡排序 冒泡排序的核心思想就是:两两相邻的元素进行比较。 可以看到,这段代码对arr数组进行了排序,但这个代码还有一些缺陷,那就是无论数组内部的元素是否有序,他都会循

    2024年03月10日
    浏览(41)
  • C语言深入理解指针(非常详细)(一)

    在将内存和地址时我们先举一个生活中的例子: 假设有⼀栋宿舍楼,把你放在楼里,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩, 如果想找到你,就得挨个房子去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给每个房间编上号,如: 有

    2024年02月10日
    浏览(38)
  • C语言深入理解指针(非常详细)(二)

    指针的基本运算有三种,分别是: • 指针±整数 • 指针-指针 • 指针的关系运算 因为数组在内存中是连续存放的,比如int类型的数组,每个元素相差4个字节,因此我们只需要知道首元素的地址就可以通过加减的方式找到后面元素的地址 。 概念:野指针就是指针指向的位置

    2024年02月10日
    浏览(42)
  • C语言——从头开始——深入理解指针(1)

     一.内存和地址 我们知道计算上CPU(中央处理器)在处理数据的时候,是通过地址总线把需要的数据从内存中读取的,后通过数据总线把处理后的数据放回内存中。如下图所示: 计算机把内存划分为⼀个个的 内存单元 ,每个内存单元的大小取1个字节( 1个字节(Byte)=8个比特

    2024年02月21日
    浏览(46)
  • 【C语言】指针的入门篇2,深入理解指针和数组的关系

    欢迎来CILMY23的博客喔,本期系列为【C语言】指针的入门篇2,深入理解指针和数组的关系,图文讲解指针和数组关系的知识,带大家理解指针和数组的关系,以及指针+数组的用法,感谢观看,支持的可以给个赞哇。 前言 在上一篇博客中,我们了解了指针就是地址,并且把地

    2024年02月20日
    浏览(49)
  • 带你深入理解“栈”(c语言 c++和stl Stack三个版本的模拟实现)

    目录 一.栈的概念及结构 二.栈的实现(c语言版) 2.1静态增长的栈 2.2动态增长的栈 2.3动态栈的模拟实现    1.栈的初始化   2.入栈  3.出栈 4.获取栈顶元素 5.获取栈中有效数据个数 6.检查栈是否为空 7.栈的销毁 三.C++ 版本模拟实现栈  1.C++版本的源代码 四.c语言版本的源代码

    2024年02月08日
    浏览(45)
  • 十道题带你手撕二叉树

    题目: 思路一:( 遍历的方法 ) 将根节点的值与二叉树中的每一个节点存储的val值进行比较,如果不同就返回false,如果全部相同,就返回true。 代码: 思路二: 判断当前根节点的值是否与其左右子节点的值相等,如果不相等就返回 false ,同样,如果递归调用到了节点为

    2023年04月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包