20240730嵌入式学习笔记

排列算法

对数据大批量操作可以利用数组,但大部分情况下数组中的数据需要经过排序才能够被利用。

数组排序即将数组中的数据按照一定顺序进行排列,一般分为升序排列和降序排列;升序排列指数据按从小到大的顺序排列,反之即为降序排列。下列算法举例均默认为升序排列。

数组的排列算法一般有四种:选择排列、冒泡排列、插入排列、快速排列。

选择排列:

选择排列的思路为选择最低位数,将其依次与其他数进行比较,如果在比较过程中找到比他小的数,两个数交换位置,继续用最低位数(此时为交换过的较小数)与剩余数进行比较,直到确定最低位数为最小值;取次低位重复此前的操作,直到确定次高位数小于最高位数。此时最高位为最大数,最低位为最小值,即完成升序排列操作。

流程图:

示例代码:

#include <stdio.h>
//选择 升序
int main(void)
{
	int i,j,len,tmp;
	printf("Input length of the array:\n");
	scanf("%d",&len);
	if(len < 0)
	{
		printf("Input error! Try again.\n");
		return -1;
	}
	int arr[len];
	printf("Input %d numbers of array:\n",len);
//输入
	for(i=0;i<len;++i)
	{
		scanf("%d",&arr[i]);
	}
	printf("--- --- --- ---\n");
//排序
	for(i=0;i<len;++i)
	{
		for(j=i+1;j<len;++j)
		{
			if(arr[j] < arr[i])
			{
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
		}
	}
//输出
	printf("--- --- --- ---\n");
	for(i=0;i<len;++i)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

运行结果 :

./select_up
Input length of the array:
5
Input 5 numbers of array:
5 -1 6 -8 30
--- --- --- ---
-8
-1
5
6
30

冒泡排序:

冒泡排序的思路为,确定最大值:取出第一个数据,向右与下一位相邻数据进行比较,通过交换将其中较大的值放置在高位,将其中较大的值与向右下一位相邻数据进行比较,通过交换将其中较大的值放置在高位,以此循环,直到与最高一位比较完。此时可以确定最高位数为数组中最大的值。

确定最大值后需要确定次大值:依然从最低位开始,与向右下一位相邻数据进行比较,通过交换将其中较大值放置在高位,将其中较大的值与向右下一位相邻数据进行比较,通过交换将其中较大值放置在高位,以此循环,直到与次高位比较完。此时可以确定次高位数位数组中次大值。

同样的步骤一直进行下去,直到最低位与次低位数比较完,此时可以确定最大值、次大值、次次大值....直到最小值。此时即完成了数组的升序排列。

整体思想与选择排列相同:每次通过比较求出最大值,并放置在末位,最终得到升序数组。

 

示例代码: 

#include <stdio.h>
//冒泡 升序
int main(void)
{
    int in,out,tmp,len;
    printf("Input length of the array:\n");
	scanf("%d",&len);
	int array[len];
	printf("Input %d numbers of the array:\n",len);
//输入
	for(in = 0;in < len;++in)
    {
        scanf("%d",&array[in]);
    }
//排序
    for(out=0;out<len-1;++out)
    {
        for(in=0;in<len-1-out;++in)
        {
            if(array[in] > array[in+1])
            {
                tmp = array[in];
                array[in] = array[in+1];
                array[in+1] = tmp;
            }
        }
    }
//输出
	printf("--- --- --- ---\n");
	for(in=0;in<len;++in)
	{
		printf("%d\n",array[in]);
	}
}

 运行结果:

./bubble_up
Input length of the array:
5
Input 5 numbers of the array:
6 -1 3 -8 4
--- --- --- ---
-8
-1
3
4
6

插入排列:

插入排列的思路为一次将将数据取出,从原始位置判断是否为合适位置:取出次低位数据,判断上一位数据(即最低位数)是否大于次低位数据,如果大于则将最低位数右移,将原先次低位数据填入最低位;取出第三低位数,判断次低位数据是否大于第三低位数据,如果大于则将次低位数右移一位到第三低位,此时原先第三低位数变为次低位数,此时判断最低位数是否大于次低位数,如果大于则将最低位数右移一位到次低位,此时原先次低位数变为最低位数。一次重复,将每一位数取出与前一位数进行判断大小,将较大数右移,较小数补位,直到这一位数放置到合适的位置。最终确定最高位数的位置之后,即完成了升序排列。

示例代码:

#include <stdio.h>
//插入 升序
int main(void)
{
	int a,b,tmp,len;
	printf("Input the length of the array:\n");
	scanf("%d",&len);
	int arya[len],aryb[len];
	printf("Input %d numbers of the array:\n",len);
//输入
	for(a=0;a<len;++a)
	{
		scanf("%d",&arya[a]);
	}
//排序
	aryb[0] = arya[0];
	for(a=1;a<len;++a)
	{
		tmp = arya[a];
		b = a;
		while(b > 0 && aryb[b-1] > tmp)
		{
			aryb[b] = aryb[b-1];
			--b;
		}
		aryb[b] = tmp;
	}
//输出
	printf("--- --- --- ---\n");
	for(a=0;a<len;++a)
	{
		printf("%d\n",aryb[a]);
	}
	return 0;
}

运行结果:

./select_up
Input length of the array:
5
Input 5 numbers of array:
9 -1 6 40 -3
--- --- --- ---
-3
-1
6
9
40

查找算法

查找算法的常规思路为二分法,即将数据一分为二,确定要查找的数据在哪个范围中,每次折半从而缩小查找范围。最终确定到要查找数的位置。

是用二分法进行查找的前提为数据为有序排列,否则二分法将无意义。

示例代码:

#include <stdio.h>
//插入法升序排列 二分法查找
int main(void)
{
//输入长度
	int i,len;
	printf("Input length of the array:\n");
	scanf("%d",&len);
//输入数组
	int ary[len];
	printf("Input %d numbers of the array:\n",len);
	for(i=0;i<len;++i)
		scanf("%d",&ary[i]);
//输入被查找数
	int x,tmp;
	printf("Input the number need to find:\n");
	scanf("%d",&x);
//升序排序
	for(i=1;i<len;++i)
	{
		tmp = ary[i];
		while(i>0 && tmp < ary[i-1])
		{
			ary[i] = ary[i-1];
			--i;
		}
		ary[i] = tmp;
	}

//打印正序数组
	printf("array:\n");
	for(i=0;i<len;++i)
	{
		printf("%d ",ary[i]);
	}
	printf("\n");
//查找
	int begin,end,mid;
	begin = 0;
	end = len - 1;
	while(begin <= end)
	{
		mid = (begin + end) / 2;
		if(x < ary[mid])
			end = mid - 1;
		else if(x > ary[mid])
			begin = mid + 1;
		else
			break;
	}
//显示结果
	if(begin <= end)
		printf("ary[%d] = %d\n",mid,x);
	else
		printf("%d not found!\n",x);

	return 0;
}

运行结果:

./insert_search 
Input length of the array:
5
Input 5 numbers of the array:
9 -1 3 -7 2
Input the number need to find:
2
array:
-7 -1 2 3 9 
ary[2] = 2

插入排序流程图来源:https://blog.csdn.net/u010039043/article/details/118440114

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值