插入排序、二分查找、一维字符型数组

我要成为嵌入式高手之1月23日第八天!!
—————————————————————————————

学习笔记

1. 有目标

2. 有标准

        1)思路

        2)能转换成代码流程

        3)代码能不能写出来

        4)写出来之后,正确性

3. 有行动

4. 想法——现实:多练

--------------------------------------------------------

排序

哪个排序好?

评判标准:算法稳定性 和 效率

       时间:时间复杂度---CPU执行代码(指令)的数量 = 消耗的时间(不是一种具体时间,而是一种趋势)O(n) // 大O计法

3. 插入排序

思想:(在有序的序列中)找一个合适的位置,插入

#include <stdio.h>
 //思想:拿数放入合适的位置
int main()
{
    int n,i,j,t;
    printf("Input how many numbers? ");
    scanf("%d",&n);
    int a[n];
    int b[n];
 
    for (i = 0; i < n; ++i)//输入n个数的数组
    {
        scanf("%d",&a[i]);
    }
 
    printf("low: ");
    for (i = 0; i < n; ++i)//打印原来顺序的数组
    {
        printf("a[%d] = %d ",i,a[i]);
    }
    putchar('\n');

    for (i = 0; i < n; ++i)//拿数
    {
        t = a[i];
        j = i;//准备要放的位置
        while (j > 0 && b[j-1] > t)//当j>0且前面的数大于t时
        {
            b[j] = b[j-1];//前面的值往后挪
            --j;//再与更前面一个数进行比较
        }
        b[j] = t;//如果到第一个位置(0)或者该数比前一个数大,就插入在该位置
    }

    printf("new: ");
    for (j = 0; j < n; ++j)//输出排序好的数
    {
        printf("b[%d] = %d ",j,b[j]);
    }
    putchar('\n');

    return 0;
}

查找

二分查找(折半查找)

前提:数据必须有序

#include <stdio.h>

int main()
{
    int i,j,n,t;
    printf("Input how many numbers? ");
    scanf("%d",&n);
    int a[n];
    int b[n];
    
    
    for (i = 0; i < n; ++i)
    {
        scanf("%d",&a[i]);
        printf("a[%d] = %d ",i,a[i]);
    }
    putchar('\n');

    for (i = 0; i < n; ++i)
    {
        t = a[i];
        j = i;

        while (j > 0 && b[j-1] > t)
        {
            b[j] = b[j-1];
            --j;
        }
        b[j] = t;
    }

    for (j = 0; j < n; ++j)
    {
        printf("b[%d] = %d ",j,b[j]);
    }
    putchar('\n');

    int k ,mid;
    int begin = 0;
    int end = n-1;
    printf("Input numbers to find: ");
    scanf("%d",&k);

    while (begin <= end)
    {
        mid = (begin + end) /2;
        if(b[mid] > k)
        {
            end = mid - 1;
        }else if (b[mid] < k)
        {
            begin = mid + 1;
        }else
        {
            break;
        }
    }

    if (begin <= end)
    {
        printf("k = b[%d] = 5\n",mid);
    }else
    {
        printf("NULL\n");
    }
    
    return 0;
}

一维字符型数组:

字符数据:

unsigned char s[10] ;

unsigned char s[10] = {'h','e','l','l','o'}; // 数组角度看

" hello "  // 字符串常量,本质是存储的时候,是按照字符数组的形式存储

------->  unsigned char s[10] = {'h','e','l','l','o','\0'}; // 数组角度看

'\0' 对字符串来说叫做结束标志,字符串要求必须以\0作为结束标志

最主要的作用:想处理字符串数据

注意:

        1、字符串——更关注的是字符串整体,而不是单个字符

        2、字符串的结束标志比较重要,表示字符串结束

        3、处理字符串时,常常使用结束标志进行判断(while(s[i] != o)putchar(s[i]))

puts() :输出字符串

gets() :输入字符串

s2 = s1; // c语言中不能整体赋值

字符串拷贝:

        strcpy ( 目标字符串,原字符串) 把原字符串拷贝到目标字符串

作业

1. 字符串拼接

流程图:

#include <stdio.h>

int main()
{
    char s1[20] = "hello";
    char s2[20] = "world";
    int i;
    int j = 0;

    while (s2[j] != '\0')
    ++j;
 //   printf("j = %d",j);

    for (i = 5; i < 6+j; ++i)
    {
        s1[i] = s2[i-5];
    }
    puts(s1);

    return 0;
}

2、从终端输入一个n 将数组 int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9} 完成如下变化,并打印,

操作方

n:1 9 1 2 3 4 5 6 7 8

n:2 8 9 1 2 3 4 5 6 7

n:3 7 8 9 1 2 3 4 5 6

流程图:

#include <stdio.h>

int main()
{
    int a[9] = {1,2,3,4,5,6,7,8,9};
    int n,t,j,i;

    scanf("%d",&n);
    printf("n:%d  ",n);

    for (j = 0; j < n; ++j)
    {
        i = 8;
        int t = a[i];
        for (i = 8; i > 0; --i)
        {
            a[i] = a[i-1];
        }
        a[0] = t;
    }

    for (i = 0; i < 9; ++i)
    {
        printf("%d ",a[i]);
    }
    putchar('\n');

    return 0;
}

 

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值