C语言常用算法归纳

记录一些常用的算法,包括实际应用的。
首先是冒泡排序。这个一般在一些滤波算法的时候可能会用到。
冒泡排序:

#include<stdio.h>
int main()
{
    #define n 10
    int a[n];
    int i,j,k,t;
    
    for (i = 0;i < n; i++)
    {
        scanf("%d",&a[i]);
    }
    // 冒泡排序
    for (j = 1; j <= n-1; j++)	//n个数处理n-1趟
    {
        for (i = 0; i <= n-j-1; i++)	//	每趟比原来少一次
        {
            if (a[i] > a[i+1])	// 依次比较挨着的两个值,把大的放后面
            {
                t = a[i]; a[i] = a[i+1]; a[i+1] = t;
            }
        }
    }
    
    for (i = 0;i < n;i++)
    {
        printf("%d\n",a[i]);
    }
    
 	return 0;
}

冒牌排序的算法的基本思维是:
1.对存放序列的数组的第一个元素到最后一个元素,依次对相邻的两个元素进行比较,如果前者大,则调换顺序;
2.第一趟结束后,则最大的数就存放在最后一个元素了,然后从第一个数到倒数第二个数,依次进行相邻两个数比较大小,若前者大,则调换顺序。
3.重复操作。
哈哈哈哈想当初面试的时候,面试hr问我知道那些排序,答曰:冒泡排序。然后让我讲讲冒泡排序咋实现的,然后我就不知道了。
应用:中值滤波。中值滤波就是对一个序列的数,选取中间的数作为最终输出。因此首先需要对序列数进行排序。

	for(cnt=0; cnt<N; cnt++)
	{
   	while((LPC_ADC->ADSTAT & 0x2F) ==0);
		value_buf[0][cnt] = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_0);
		
		value_buf[1][cnt] = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_1);

		value_buf[2][cnt] = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_2);

		value_buf[3][cnt] = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_3);

		value_buf[4][cnt] = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_5);
	}
// 冒泡排序法
	for(k=0; k<5; k++)
	{
		for(j=0; j<N-1; j++)
		{
			for(i=0; i<N-j-1; i++)
			{
				if(value_buf[k][i] > value_buf[k][i+1])
				{
					temp = value_buf[k][i];
					value_buf[k][i] = value_buf[k][i+1];
					value_buf[k][i+1] = temp;
				}
			}
		}
	}
	adc_value[0] = value_buf[0][(N-1)/2]*3258 >> 12;
	adc_value[1] = value_buf[1][(N-1)/2]*3258 >> 12;
	adc_value[2] = value_buf[2][(N-1)/2]*3258 >> 12;
	adc_value[3] = value_buf[3][(N-1)/2]*3258 >> 12;
	adc_value[4] = value_buf[4][(N-1)/2]*3258 >> 12;

上面是五个通道的采样值,选取中位数。

选择排序:
选择排序算法的步骤:
1.从存放序列数的数组中找出最小数的下标,然后将最小值与第一个数交换位置;
2.除第一个数之外,再从剩余的n-1个数,找出最小数的下标,将次数与第二个数交换位置;
3.重复操作;

#include<stdio.h>
int main()
{
    #define n 10
    int a[n],i,j,k,t;
    
    for (i = 0;i < n; i++)
    {
        scanf("%d",&a[i]);
    }
    
    for (i = 0; i < n-1; i++)		//	处理n-1趟;
    {
        k = i;		//	总是假设此趟处理的第一个数最小,并记录其下标;
        for (j = i +1; j < n; j++)
        {
            if (a[j] < a[k])
            {
                k = j;
            }
        }
        if (k != i)
        {
            t = a[i]; a[i] = a[k]; a[k] = t;
        }
    }
    
    for (i = 0;i < n;i++)
    {
        printf("%d\n",a[i]);
    }
    
	return 0;
}

有序数列的插入算法:
将某个数据插入都一个有序的数列中,使其仍然有序;

#include<stdio.h>
#define n 10
int main()
{

    int a[n] = {1,2,4,5,8,10,15,16,20};		// 9个数,空出一个
    int i,j,x;
    
    scanf("%d",x);
    if (x > a[n-2])
    {       
        a[n-1] = x;		//	比最后一个数都大则往最后一个数放
    }
    else		//查找待插位置;
    {
        i = 0;
        while (i <= n-3 && x > a[i])		//	检测剩下的n-2个数
        {
              i++;
        }
        for (j=n-2; j>=i;j--)
        {
            a[j+1] = a[j];
        }
        a[i] = x;		//	插入带插入的数;
    }
    
    for (i = 0;i < n;i++)
    {
        printf("%d\n",a[i]);
    }
    
 	return 0;
}

插值排序:

#include<stdio.h>
#define n 10
int main()
{

    int a[n];
    int i,j,k,x;
    
    scanf("%d",&a[0]);	//读入第一个数,存放在a[0]中;
    
    for (j = 1; j < n; j++)		//将第二个数到第10个数一次存放在数组a中
    {
       scanf("%d",&x);
       if (x < a[j-1])	// 比原数列最后一个数还小就往最后一个元素之后存放新的数;
       {
           a[j] = x;
       }
       else		//	一下查找带插值位置
       {
           i = 0;
           while (x < a[i] && i <= j-1)
           {
               i++;
           }
           for (k = j-1; k >= i;k--)	//循环从原最后一个数开始直到待插值位置上的数依次往后移一位;
           {
               a[k+1] = a[k];
           }
           a[i] = x;
       }
    }

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

查找:
查找的思路就是将待查找的量与数组中的每一个元素进行比较,若有一个元素与之相等,则找到,如果没有,则没找到;
顺序查找:
顺序查找的思路就是将要查找的元素依次与数组内的每一个元素相比较,如果遇到相等的,则说明找到了,反之,则说明没有找到;

#include<stdio.h>
#define n 10
int main()
{

    int a[n] = {1,2,3,4,5,6,7,8,9,10};
    int i,x,flag = 0;
    
    scanf("%d",&x);
    for (i = 0; i < n; i++)
    {
        if (x == a[i])
        {
            printf("yijingchadao"); 
            flag = 1;
        }
    }
    if (0 == flag)
    {
        printf("meiyouzhaodao"); 
    }
    
 
 	return 0;
}

二分法查找:

#include<stdio.h>
#define n 11
int main()
{

    int a[n] = {1,2,3,4,5,6,7,8,9,10,11};
    int x,high,low,mid;
    
    scanf("%d",&x);
    high = n-1; low = 0; mid = (high + low)/2;
    while (x != a[mid] && high > low)
    {
        if (x > a[mid])
        {
            low = mid + 1;
        }
        else
        {
            high = mid - 1;
        }
        mid = (high + low)/2;
    }
    if (x == a[mid])
    {
        printf("Found");
    }
    else
    {
        printf("not fonud");
    }
    
    return 0;
}
  • 7
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值