0730嵌入式零基础(排序)

排序

选择排序:

思路:
每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。

选择排序算法的原理如下:

​ 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;
			}
		}
	}

动态图:

9df60e73425345f68f2ec36e5f04092d.gif

 

冒泡排序

 

思路:

 一次冒出一个数 ,相邻两个元素,两两比较,小的放前,大的放后 

冒泡排序算法的原理如下:

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]);
      }
 }
                     

动图:

31bc8a1bfd9542c4b7a8c3717b6bf724.gif

 

注意:冒泡排序是一个个与身边的数作比较,然后将最值排序到最后(最前),而选择排序是一个值与其他值作比较,然后进行交换。

 

插入排序

插入排序算法的原理如下:

  1. 初始状态:将第一个元素视为已排序部分,其余元素为未排序部分。

  2. 从第二个元素开始,依次将未排序部分的元素插入到已排序部分中的正确位置:

    • 每次将一个待排序的元素(当前元素)插入到已排序部分的合适位置。
    • 将当前元素与其前面的元素依次比较,直到找到合适的插入位置。
  3. 重复直到所有元素都有序。

  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 }
~           

动图:

7e791458d2064792977a786ca5e72f73.gif

 

 

查找算法

二分查找:

二分查找又称折半查找,是一种相比较顺序查找效率较高的查找方法。但是,二分查找要求线性表中的记录必须采用顺序存储。

流程图:

79b73dd1069a43199652410cb03d1a83.png

 

代码:

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’前的元素个数

    

 

 

 

 

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值