算法入门

有非常多的算法,比如递推法,穷举法,贪心算法,分治法,动态规划法,迭代法,分支界限法,回溯法.

仓库地址

Fundamentals of Algorithmics

1.数组倒置算法

数组中有非常多的算法,比如倒置,查找,插入,删除,排序,这些算法都非常重要,下面首先介绍倒置。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[5] = {1,2,3,4,5};
int b[5]; // 用来存放倒置后的数据
int i,j;
for (i=0,j=4; i<5,j>=0;++i,--j)
{
b[i] = a[j];
printf("%d\n",b[i]);
}
return 0;
}

数组倒置——互换算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[23] = {1,5, 66,8,55,9,1,32,5,65,4,8,5,65,4,8,5,15,64,156,1564,15,1,8,9,7,215};
int i = 0; // 循环变量1,i的值为数组第一个元素的下标
int j = 22; // 循环变量2,j的值为数组第一个元素的下标
int buf; // 互换时的中间存储变量

for (; i < j;++i, --j)
{
buf = a[i];
a[i] = a[j];
a[j] = buf;
}
for (int i = 0; i < 23; ++i)
{
printf("%d\x20",a[i] ); // \x20表示空格
}
printf("\n");
return 0;
}

2.顺序查找算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[] = {
1,5,66,8,55,9,1,32,5,65,4,8,5,
65,4,8,5,15,64,156,1564,15,1,8,
7,12,50,62,3,65,906,176,51,21,13
};

int n; // 存放数组a中元素个数
int m; // 查找的数字
int i; // 循环变量

n = sizeof(a)/sizeof(int);

printf("请输入一个数字:");
scanf("%d",&m);
for (int i = 0; i < n; ++i)
{
if (a[i] == m)
{
printf("下标 = %d\n",i);
break;
}
}
if (i == n)
{
printf("sorry\n");
}
return 0;
}

输出:

1
2
请输入一个数字:7
下标 = 24

3.折半查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[] = {13,45,78,90,127,289,243,355};
int key; // 存放要查找的数

int low = 0;
int high = sizeof(a)/sizeof(a[0])-1;
int mid;

int flag = 0; // 标志位,用于判断是否存在要找的数
printf("请输入您要查找的数:");
scanf("%d",&key);

while (low<=high) {
mid = (low+high)/2;

if (key<a[mid]) {
high = mid-1;
}
else if (a[mid]<key){
low = mid+1;
}
else{
printf("下标 = %d\n",mid);
flag =1;
break;
}
}
if (0 == flag) {
printf("sorry,data is not found\n");
}

return 0;
}

输出:

1
2
请输入您要查找的数:13
下标 = 0

4.插入算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[23] = {1,5,66,8,55,9,11,25,7,96,20,95,72,8,67,33,41,68,23,45,66,88,92};
int b[24]; // 插入数据后的新数组
int index; // 下标
int num; // 插入的值
int i; // 循环变量

printf("请输入插入值的下标:");
scanf("%d",&index);
printf("请输入插入的值:");
scanf("%d",&num);

for (i = 0; i<24; ++i) {
if (i <index) {
b[i] = a[i]; // i小于插入位置index时,每一个元素所存放的位置不变
}
else if(i == index){
b[i] = num; // i= index时,将插入值赋给数组b
}
else{
b[i] = a[i-1]; // 插入位置后的每一个元素所存放的位置后移一位
}
}
for (i = 0; i<24; ++i) {
printf("%d\x20",b[i]);
}
printf("\n");
return 0;
}

输出:

1
2
3
请输入插入值的下标:4
请输入插入的值:77
1 5 66 8 77 55 9 11 25 7 96 20 95 72 8 67 33 41 68 23 45 66 88 92

5.删除算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[23] = {1,5,66,8,55,9,11,25,7,96,20,95,72,8,67,33,41,68,23,45,66,88,92};
int b[22]; // 删除数据后的新数组
int index; // 要删除的值的下标
int i; // 循环变量

printf("请输入删除的下标:");
scanf("%d",&index);


for (i = 0; i<23; ++i) {
if (i<index) {
b[i] = a[i]; //i小于插入位置index时,每一个元素所存放的位置不变
}
else{
b[i] = a[i+1]; // 删除值后面的元素都向前移动一位,要删除的值被覆盖
}
}
for (i = 0; i<22; ++i) {
printf("%d\x20",b[i]);
}
printf("\n");
return 0;
}

输出:

1
2
3
请输入删除的下标:5
1 5 66 8 55 11 25 7 96 20 95 72 8 67 33 41 68 23 45 66 88 92
Program ended with exit code: 0

仓库地址

文章作者: 张雄
文章链接: http://www.zhxiong.com/2019/03/30/算法入门/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张雄
打赏
  • WeChat
  • Alipay
simplified