自学嵌入式第七天C语言篇6

目录

排序

选择排序

冒泡排序 

插入排序 

查找 

二分查找 


排序

选择排序

        算法思想:给合适的位置选择合适的数。

        实现过程:(升序为例)有n个数,我们先选第一个数为基准,从第二个数开始,先跟第一个数比较,如果第一个数大于第二个数,则两个数交换,如果没有,则用第三个数跟三个数跟它比较,重复上面的过程,当最后一个数跟它比完,则第一个数就是所有数中最小的数,然后将基准放在第二个数,还是用它的后一个数开始重复第一次的过程,知道倒数第二数,直接跟最后一个数比较,整个过程结束,排序完成。

        代码实现:

//len为数组长度
//外层循环控制当前的位置
for (i = 0;i < len -1;i++)
{
    //内层循环控制第几个数跟当前位置的数比较
    for (j = j + 1;j < len;j++)
    {
        if (a[j] < a[i])
        {
            int temp = a[j+1];
            a[j+1] = a[i];
            a[i] = temp;
        }
    }
}

        流程图:

冒泡排序 

        算法思想:(升序为例)一次冒出一个数,相邻两个数两两比较,小的放前面,大的放后面。

        实现过程:第一次冒泡时,从第一个数开始,跟第二个数比较 ,如果第一个数大于第二个数,则两个数交换位置,前两个比的时候,大的数跑到了第二个位置,接着将第二个位置的数跟第三个数比较,也是小的在前,大的在后,知道倒数第二个数,跟最后一个位置的数比较,顺序正确,数不变,顺序不对换位置,然后,第一次冒泡完成,最后一个数一定是最大的,然后开始第二次冒泡,只是最后一个数被排除在外了,经过n-1次冒泡,排序完成。

        代码实现:

//len为数组长度
//外层循环控制冒泡的次数,共len-1次
for (i = 0;i < len -1;i++)
{
    //内层循环控制是否要将两两相邻的数交换
    for (j = 0;j < len-1-i;j++)
    {
        if(a[j+1] > a[j])
        {
            int temp = a[j+1];
            a[j+1] = a[j];
            a[j] = temp;
        }
    }
}

        流程图:

插入排序 

        算法思想:在有序的序列中找到合适的位置插入

        实现过程:(升序)一组数排序时,第一个数不变,第二个数跟第一个数比较时,只有两种结果,如果比第一个数大,放右边;如果比一个数小,那么刚才想插入的位置上就要更新为第一个数的值,将第一个数的位置空出来,将第二个数插入到第一个位置去。 该算法,主要是要理解,某个数要插入的位置是它本来想呆的位置,只是如果它比前一个数还小,它就得依次去找到它能呆的位置,它有两种可能停下它找位置的脚步,要么它找到第一个位置了,不能再往前找了,那它就是最小的,或者它找到前面已经拍好的数之间它比某一个数大,那他就挨着它的右边放。经过n次插入,整组数排序完成

        代码:

//非原地插入
//外层循环控制第几个插入的数字
for (i = 0;i < len;i++)
{
    //内层循环是找到合适的位置,依次与前一个比,如果找到开头或者找到一个比它小的数就停止
    j = i;
    while (j > 0 && a[i] < b[j-1])
    {
        b[j] = b[j-1];
        j--;
    }
    b[j] = a[i];
}
//原地插入
for (i = 0;i < len;i++)
{
    int temp = a[i];
    j = i;
    while (j > 0 && temp < a[j-1])
    {
        a[j] = a[j-1];
        j--;
    }
    a[j] = temp;
}

        流程图:

查找 

二分查找 

        算法思想:在有序(升序为例)的数列中,找到中间值与要查找的值进行比较,如果大于要查找的值,则往前半区找,反之找后半区,每次都先找到中间值,与要查找的值比较。直到找到或者超出边界(找不到)。

        代码:

int begin,end,mid;
int num;


begin = 0;
end = len - 1;
scanf("%d",&num);

while (begin <= end)
{
    //找到中间位置的下标
    mid = (begin + end) / 2;
    //分区,如果中间值大于num,找前半区,将end移到mid的前一位
    if (a[mid] > num)
    {
        end = mid - 1;
    }
    //如果中间值小于num,找后半区,将begin移到mid的后一位
    else if (a[mid] < num)
    {
        begin = mid + 1;
    }
    //找到,退出循环
    else
    {
        break;
    }
}

if (begin <= end)
{
    printf("found\n");
}
else
{
    printf("not found\n");
}

        流程图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值