排序
选择排序:
思路:
每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。
选择排序算法的原理如下:
1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3.重复第二步,直到所有元素均排序完毕。
for(i=0;i<len-1;i++)//外层循环,遍历数组
{
for(j=i+1;j<len;j++)//内层循环,找出最小值。
{
if(a[j]<a[i])//判断最小值,一个数与其他数作比较。
{ //交换数
tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}
}
动态图:
冒泡排序
思路:
一次冒出一个数 ,相邻两个元素,两两比较,小的放前,大的放后
冒泡排序算法的原理如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include<stdio.h>
int main(void)
{
int n=5;
int i,j,k,a[n];
for(i=0;i<n;i++)
{
scanf("%d ",&a[i]);
}
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
}
}
for(i=0;i<5;i++)
{
printf("%d ",a[i]);
}
}
动图:
注意:冒泡排序是一个个与身边的数作比较,然后将最值排序到最后(最前),而选择排序是一个值与其他值作比较,然后进行交换。
插入排序
插入排序算法的原理如下:
-
初始状态:将第一个元素视为已排序部分,其余元素为未排序部分。
-
从第二个元素开始,依次将未排序部分的元素插入到已排序部分中的正确位置:
- 每次将一个待排序的元素(当前元素)插入到已排序部分的合适位置。
- 将当前元素与其前面的元素依次比较,直到找到合适的插入位置。
-
重复直到所有元素都有序。
1 #include<stdio.h>//该为原地插法
2
3 int main(void)
4 {
5 int a[14]={3,2,5,15,26,27,36,44,48,46,47,19,50,48},i,j,k;
6 for(i =1;i<14;i++)
7 {
8 int k=a[i];
9 j=i;
10 while(j>0&&k<a[j-1])
11 {
12 a[j]=a[j-1];
13 j--;
14 }
15 a[j]=k;
16
17 }
18
19 for(i =0;i<14;i++)
20 {
21 printf("%d ",a[i]);
22 }
23 return 0;
24
25 }
~
动图:
查找算法
二分查找:
二分查找又称折半查找,是一种相比较顺序查找效率较高的查找方法。但是,二分查找要求线性表中的记录必须采用顺序存储。
流程图:
代码:
int begin,mid,end;
begin = 0;
end = len-1;
while (begin <= end)//判断循环条件
{
mid = (begin+end)/2;//找中间值
if (a[mid] > m)//判断与中间值的比较,如果小于中间值则执行以下条件
{
end = mid - 1;//将end变为上一层中间值减一,及附近位置
}else if (a[mid] < m)//判断与中间值的比较,如果大于于中间值则执行以下条件
{
begin = mid + 1;//将begin变为上一层中间值加一,及附近位置
}else
{
break;
}
}
if (begin <= end)//判断是否找到
{
printf("found!\n");
}else
{
printf("not found!\n");
}
return 0;
}
一维字符型数组:
存储的是字符串数据,c语言中字符串实际上是做我字符型数组来存储的
→“hello”→'h','e','l','l','o','\0'
数据类型 数组名[数组长度];
int a [10];
char s [20]; //一维字符型数组
从数组角度:
char s[20] = {'a','b','c','d'};//是以每个字符存储的
字符串的角度 :
char s[20] = {"hello"};//以字符串进行存储
特点
1.字符串 是 当做字符数组来处理的。
2.字符串 有一个专门的结束标志 '\0'
3.处理的是字符串,操作的时候,往往以 结束标志 为 操作依据
4.处理的是数组,操作的时候,往往以 数组长度 作为操作依据
5.字符数组可以用来存储字符串 而字符串在内存中存储的方式 也是以 字符数组形式存储的
比如: "hello" --- 'h''e''l''l''o''\0'
实际占用的内存空间,是包含了'\0'
注意:" " //字符串 --- 空字符串 '\0'
比如:
1.char a[]={'a','b','\0','c','\0'}
此时输出结果为 ab,因为遇到'\0'判断你输出完成了。
gets():
功能: 给字符数组中,输入一个"字符串"
char *gets(char *s)
char *gets(char s[]) //传一个字符数组的数组名
参数:
s 表示 需要传的是一个 字符数组的 名字
返回值:
表示 存放字符串的 那块空间的地址
注意:
这个函数是危险的,不推荐使用。因为会发生数据越界了
char s[] = "hello";
char s1[] = {'w','o','r','l','d'};//该字符长度为5
gets(s1);//如果输入123456;
puts(s);
puts(s1);
输出结果为:hello
12345llo
这里因为输出长度大于了定义的字符串长度,又因为定义的两个字符串命名类似(S,S1)所以分配的内存挨在一起,导致S1的储存位置不够,就将会占用S的储存位置,从而导致发生数据越界。
puts():
功能: 将字符串输出,(它会默认输出一个'\n')
int puts(const char *s);
参数:
s //可以是数组名 也可以是 一个字符串常量
返回值:
成功 非负数
失败 -1
注:
1.数组 主要是用来 存储数据的
2.字符数组,主要是 存储 "字符串" 数据的
区分数组长度和字符串长度:
数组长度:数组全部元素的个数
字符串长度:‘\0’前的元素个数