记录一些常用的算法,包括实际应用的。
首先是冒泡排序。这个一般在一些滤波算法的时候可能会用到。
冒泡排序:
#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;
}