提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
常用的经典算法#C语言
前言
`简单的记录自己的成长过程吧
一、累加和,连乘积,最大最小值
1、累加和
顾名思义就是把数字一个一个相加然后求和,代码如下:
#include <stdio.h>
int main()
{
//从一加到一百
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum = sum + i;//累加法
}
printf("1+2+…+99+100=%d\n", sum);//打印和
return 0;
}
2、连乘积
类似于累加和,不同的是这里是相乘,代码如下:
#include <stdio.h>
int main()
{
int sum = 1;
for (int j = 1; j <= 25; j++)//数字过大的话int类型存不下
{
sum *= j;//连乘积
}
printf("1*2*…*99*100=%d\n", sum);
return 0;
}
//结果应该是1*2*…*99*100=2076180480,是相当大的一个数字了。
3、求最大最小值
在一组数据中找到最大或者最小值,这个数据可以是一维线性的,也可以是二维矩阵的。
一维:在这里就求最大值了
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,45,67,54,34,89,98,34,57 };//定义一个一维数组存放数据
int max = arr[0];//假设第一个是最大值
for (int i = 0; i < 10; i++)//利用for循环把数组历遍
{
if (arr[i] > max)
max = arr[i];
}
printf("max=%d", max);
return 0;
}
二维:这里求最小值
#include <stdio.h>
int main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };//定义一个二维数组来存放数据
int min = arr[0][0];//假设第一个为最小值
for (int j = 0; j < 3; j++)//历遍二维数组
{
for (int i = 0; i < 3; i++)
{
if (arr[j][i] < min)
min = arr[j][i];
}
}
printf("min=%d", min);
return 0;
}
二、查找
1、顺序查找
亲应该都知道,我就不赘述了
2、折半查找(二分查找法)
这么说吧,假如一颗钻石被自由女神像吃进肚子了,然后你想要找到它,于是胆小的你就把自由女神像炸成了两半,结果不在下半部分,那么你就继续把上半部分炸成两半,那你应该懂折半查找了吧。话不多说,给代码:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int arr[10] = { 2,4,35,56,7,67,9,8,10,99 };//定义一个一维数组来存放数据
int left = 0;//最左边下标
int right = 9;//最右边下标
int mid = (left + right) / 2;//神像一分为二
while (left<=right)//进入循环
{
if (arr[mid] < n)//中间的数字小于你要查找的数字
{
left = mid + 1;
mid = (left + right) / 2;
}
if (arr[mid] > n)//中间的数字大于你要查找的数字
{
right = mid - 1;
mid = (left + right) / 2;
}
if (arr[mid] == n) //找到了数字,mid就是它在数组中的下标
{
printf("找到了,下标是:%d", mid);
break;
}
}
if (left > right)//跳出循环有两种情况:判断其中一种为找不到的情况
printf("找不到数字,建议你换一个");
return 0;
}
三、排序
1、选择法排序
就是先找最小的把它放到第一个,然后找第二小的把它放在第二个,后面的数字也是如此,到最后一个。这就相当于你有100个数字的话,你就要找99次。代码如下:
#include <stdio.h>
int main()
{
//选择法
int arr[] = { 13,34,65,87,67,49,27 };//定义一个一维数组来存放数据
int p = 0;//定义一个变量来存放最小的数字的下标
for (int j = 0; j < 7; j++)
{
int min = arr[j];
for (int i = j+1; i < 7; i++)
{
if (arr[i] < min)
{
min = arr[i];
p = i;
}
}
int temp = arr[j];//将第几小的数字放在第几个位置上
arr[j] = arr[p];
arr[p] = temp;
}
for (int k = 0; k < 7; k++)
{
printf("%d ", arr[k]);//打印出来看看
}
return 0;
}
//13 27 34 49 65 67 87
2、冒泡排序
个人认为与选择法类似,这里是把最大值找到,代码如下:
#include <stdio.h>
int main()
{
//冒泡排序
int arr[] = { 12,43,6,45,78,88,100 };
for (int i = 0; i < 6; i++)
{
if (arr[i] > arr[i + 1])//前一个与后面一个比较,进行交换
{
int temp = arr[i];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
for (int j = 0; j < 7; j++)
{
printf("%d ", arr[j]);
}
return 0;
}
3、归并排序
对于这个的话,采用了分而治之的思想。即把一组数据一个个分开排序,在进行合并。并且这个方法的效率也是十分高,由于目前水平还不够,只能自己看懂但是无法讲解,不过我可以推给你去看:
借鉴---白话经典算法系列之五 归并排序的实现
和这篇博客图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园
4、快速排序
不太好说,又不想抄别人的,就推荐你去看吧
快速排序(C语言)
冬雪如春 本文链接: https://blog.csdn.net/weixin_43296982/article/details/123098472加油,成为更棒的自己!