C语言学习(二十四)---递归与冒泡排序法

在前面几节的内容中,我们学习了指针的相关概念,至此,指针的内容就暂时告一段落了,今天我们将继续向下学习,主要内容为递归冒泡排序法,好了,话不多说,开整!!!!

递归

递归的定义与使用

在讲述递归之前,我们先介绍一个简单的例子,比如此时我想要求某个数的阶乘,自然我们是可以通过循环来实现的,大家可以自行分析,在此处我们换一个角度进行理解,我们以7的阶乘为例:
C语言学习(二十四)---递归与冒泡排序法_第1张图片
从上图中我们可以看到:
每一个等号运算后,都可以将7的阶乘进行化简,也就是先写成7*6!,6!又可以写为6*5!,以此类推
由此,我们发现这样一个事实:假设我们定义一个名为jiecheng的函数,那么阶乘实则可以看成是多次调用阶乘函数即:

res = n*jiecheng(n-1)

上述这个过程实则就是递归过程,下面我们完善阶乘的代码,自定义一个函数,用来计算阶乘:

int jiecheng(int n)
{
    int res = n*jiecheng(n-1);
    n--;
}

这样就写好了吗,显然不是,因为在这个函数中,我们并没有设置递归终止的条件,这也是使用递归时一定要格外注意的点

递归必须有终止条件

那么什么时候终止呢,那么计算阶乘,最低也就是1了嘛,所以当n<1时就不用进入循环了,设置好限制条件后,完整代码如下:

#include
int jiecheng(int n)
{
    int res = 1;
    if(n>1)
    {
        res = n*jiecheng(n-1);
        n--;
    } 
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int res = jiecheng(n);
    printf("res = %d\n",res);
    return 0;
}

编译运行,可以得到以下结果:
C语言学习(二十四)---递归与冒泡排序法_第2张图片
可以看到此时我们就使用递归的方式实现了阶乘求解,那么其递归的运算流程是啥样子呢,下面进行介绍。

递归的执行

实际上,在上述的代码中,执行时如下图所示,其中红线为调用时顺序绿色为计算单个函数的结果后返回顺序图解较为清晰,不再进行赘述
C语言学习(二十四)---递归与冒泡排序法_第3张图片

冒泡排序法

冒泡排序法,当然是一种用来排序的方法喽,到底什么是冒泡排序法,大家可以直接看百度喽,附上链接:百度百科
原理实则很简单,如下图所示:
C语言学习(二十四)---递归与冒泡排序法_第4张图片
上述图片即阐述一次冒泡排序当一次冒泡排序后,最右边的元素就是数组中最大的元素了,此时该元素保持不变,剩余元素依旧照着上述的步骤重复性进行
从上面可以看到,最开始的时候,需要将相邻的数据均进行比较,那么就需要进行需要比较3对数据,固定已经排序好的数字后,第二次排序只需要排序2对数据,然后最后一次只需比较一对数据,总共进行了3次排序,因此最外部循环的判断条件应该是

i<sz(数组中元素个数);

内部循环的判断条件应该是:
数组中元素个数-1-第几次排序;

j<sz-1-i;

比如第一次排序那就是:4-1-0=3,也即进行三次排序,
经过上述的分析之后,就可以写出完整的代码了,如下所示:

#include
int main()
{
    int arr[] = {1,7,5,9,2};
    int sz =sizeof(arr)/sizeof(arr[0]);
    int i = 0;
    for(i=0;i<sz-1;i++) //外部循环:排第几次
    {
        int j = 0;
        for(j=0;j<sz-1-i;j++)//内循环:排几对数据
        {
            if(arr[j]>arr[j+1])
        {
            int temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
        } 
    }
    for(i=0;i<sz;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

编译运行,可以发现数组已经按顺序排好:
在这里插入图片描述
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

你可能感兴趣的:(C语言学习,c语言,学习,算法)