什么是递归
简单的定义: 当函数直接或者间接调用自己时,则发生了递归。

递归函数
递归函数的执行过程分为两个阶段:
递推阶段
回归阶段
实例100
01-cbase\100-ditui.c
#include
int sum = 0 ;
void mysum(int i)
{
printf("mysum:%d\n",i); // 正常要执行的语句
sum = sum + i;
i ++; // 必须有有一个条件时刻变化
if(i > 100) return; // 要想正常使用递归 ,必须有终止条件
mysum(i) ; // 自己调用自己
}
int main(int argc, char const *argv[])
{
mysum(1);
printf("sum=%d\n",sum);
return 0;
}
mysum:1
mysum:2
mysum:3
mysum:4
mysum:5
mysum:6
mysum:7
...
mysum:94
mysum:95
mysum:96
mysum:97
mysum:98
mysum:99
mysum:100
sum=5050
快速排序法
基本原理:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可以分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

快速排序的过程
实例


void quick_sort(int *a, int left, int right)
{
if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j) // 控制在当组内寻找一遍
{
// 而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序)
// 2,没有符合条 件1的,并且i与j的大小没有反转
while(i < j && key <= a[j])
{
j--; /*向前寻找*/
}
a[i] = a[j]; // a[i] 和a[j]交换 这是伪代码
// 找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是 a[left],那么就是给key)
/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反, 因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
while(i < j && key >= a[i])
{
i++;
}
a[j] = a[i]; // a[i] 和a[j]交换 这是伪代码
sort(a, left, i - 1); /*最后用同样的方式对分出来的左边的小组进行同上的做法*/
sort(a, i + 1, right); /*用同样的方式对分出来的右边的小组进行同上的做法*/
/*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}
}
实例101
01-cbase\101-quick_sort.c
#include
#define N 6
int display_array(int *pa, int n )
{
printf("数组的内容为 >:");
for (int i = 0; i < n; i++)
{
printf("%d ", pa[i]);
}
printf("\n");
return 0;
}
/*
* 函数功能 : 快速排序法
* 参数 :
* a : 数组名, 也是数组的首地址
* left : 数组的第一个元素下标 = 0
* right : 数组的最后一个元素下标 数组元素个数-1
* 返回值:
* 成功返回 : 0
* 失败返回 : -1
*/
int quick_sort(int *a, int left, int right)
{
int i = left; // i 指向数组第一个元素下标
int j = right; // j 指向数组的最后一个元素下标
int k = a[left]; // 数组第一个元素的值
// 在使用递归时, 一定不能少递归结束条件
if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
{
return 0;
}
while (i<j) // i < j 说明 没有碰头 , i>=j, 表示碰头(第一次比较结束)
{
// 计算比 j 小的部分
// 这种情况是 k比数组右边元素小, 此时要递减j
// 找到比k 小的数, 并把这个数和k(数组的第一个元素)交换
while ((i<j)&&(k <= a[j]))
{
j--;
}
// k > a[j] 表示找到了比k小的数, 要交换 a[i] <=> a[j]
int t = a[i];
a[i] = a[j];
a[j] = t;
// display_array(a, N);
// 计算比 i 大的部分
// 这种情况是 k比数组左边元素大, 此时要递增i
// 找到比k 大的数, 并把这个数和k(数组的第一个元素)交换
while ((i<j)&&(a[i] <= k))
{
i++;
}
// a[j] >k 表示找到了比k大的数, 要交换 a[i] <=> a[j]
t = a[i];
a[i] = a[j];
a[j] = t;
// display_array(a, N);
}
quick_sort(a,left,i-1) ;// 左边分组
quick_sort(a,i+1,right); // 右边边分组
return 0;
}
int main(int argc, char const *argv[])
{
int a[N] = {6, 2, 7, 3, 8, 9};
display_array(a, N);
quick_sort(a, 0, N - 1);
display_array(a, N);
return 0;
}
数组的内容为 >:6 2 7 3 8 9
数组的内容为 >:2 3 6 7 8 9