数据结构和算法(七)

从今晚开始补课
==================
    1. 7点到八点半晚上

零长数组(柔性数组)
==================
     定义: char  buf[0];    0表示该数组不能存放任何数据(零长)
               往往跟结构体配合使用,在一些网络通信中保存发送信息的
     总结:零长数组最开始是没有大小的,后来通过耍花招,分配了堆空间(根据数据的实际长度,不造成浪费)


图像显示
=============
   1. 用算法来玩弄像素点

C语言测试题
================
    第29题
          (double)5/2+2.5
          第一种: 5--》double  5.0
    第30题
           for(i=0;  s[i];  i++)  //  中间的表达式判断s[i]的值是真还是假

           int  a=7;
           if(a)  //判断a的真假
           if(  !strcmp(buf1,buf2))


常用的排序算法
===============
   1. 衡量一个算法效率
             时间复杂度: 你的这个算法的执行次数
   2. 
                for(i=0; i<n; i++)
                {
                       for(j=0; j<n-1; j++)
                              
                }
              总共执行了  n*(n-1)次 --》n^2-n     时间复杂度  O(n^2)
              算法时间复杂度  O(n^2)            
              算法时间复杂度  O(n) 

排序算法:      
       冒泡排序
       选择排序:每次找到最小的数,标记下标,然后交换到前面
       直接插入排序:
       快排:

查找算法:
       bst树:小中大
       折半查找:有序的序列采用折半

               
作业:
      1.内存映射实现任意位置显示任意大小的bmp图片
      2.折半查找代码实现

   快速排序

#include "myhead.h"
int count=0;  //统计快排循环几次
//找基准点的位置
int getposition(int arr[],int low,int high)
{
	//临时变量存放基准值
	int temp=arr[low];
	//low和high撞到一起就结束
	while(low<high)
	{
		//当后面的元素大于等于基准数据时,向前挪动high
		while(low<high && arr[high]>=temp)
		{
			high--;
		}
			
		//如果后面的元素小于基准数据,将high赋值给low
		arr[low]=arr[high];
		
		//当前面的元素小于等于基准数据时,向后挪动low
		while(low<high && arr[low]<=temp)
		{
			low++;
		}
		//如果前面的元素大于基准数据,将low赋值给high
		arr[high]=arr[low];
	}
	//循环退出,说明low和high撞到一起
	arr[low]=temp;
	return low;  //返回基准值的正确位置
}
void quicksort(int arr[],int low,int high)
{
	//low和high撞到一起就结束
	if(low<high)
	{
		// 找基准点的位置
		int index=getposition(arr,low,high);
		//递归调用继续排序,把基准值前后的数数据继续排序
		quicksort(arr,0,index-1);
		quicksort(arr,index+1,high);
	}
}

int main()
{
	int arr[]={18,3,67,4,89,10,5};
	quicksort(arr,0,6);
	for(int i=0; i<7; i++)
		printf("%d\n",arr[i]);
	printf("count %d\n",count);
}

选择排序

#include "myhead.h"

void selectsort(int buf[],int n)
{
	int i,j;
	int min; //标记最小值的下标
	int temp;
	for(i=0; i<n-1; i++)
	{
		min=i; //假设下标i的是最小值
		for(j=i+1; j<n; j++)
		{
			if(buf[j]<buf[min])
				min=j;
		} //循环完毕的时候,找到了当前最小值的小标
		if(min!=i)
		{
			temp=buf[min];
			buf[min]=buf[i];
			buf[i]=temp;
		}
	}
}

int main()
{
	int i;
	int array[]={23,4,15,7,89,6,32};
	selectsort(array,7);
	
	for(i=0; i<7; i++)
		printf("%d  ",array[i]);
	
	printf("\n");
}

直接插入排序

#include "myhead.h"
int count=0;
void insertsort(int buf[],int n)
{
	int i,j;
	int temp;
	//最开始有序序列只有一个数: buf[0]
	//从下标为1的开始逐一往有序序列中插入
	for(i=1; i<n; i++)
	{
		if(buf[i]<buf[i-1])
		{
			temp=buf[i]; //把待插入的数据存放到temp中
			//把前面排好序的挪动,找到temp存放的位置
			for(j=i-1; buf[j]>temp && j>=0; j--)
			{
				buf[j+1]=buf[j];
				count++;
			}
			//循环结束以后,把temp放到正确的位置
			buf[j+1]=temp;
		}
	}
}

int main()
{
	int i;
	int arr[]={18,3,67,4,89,23,99,12,6,888};
	insertsort(arr,10);
	for(i=0; i<10; i++)
		printf("%d\n",arr[i]);
	printf("count %d\n",count);
	
}

内存映射显示bmp图片

#include "myhead.h"
//把图片的长宽定义宏
#define W  800
#define H  480
#define X  0
#define Y  0

int main(int argc,char **argv)
{
	int bmpfd;
	int lcdfd;
	int i;
	int x,y;
	//定义数组存放读取到的RGB数值
	unsigned char bmpbuf[W*H*3];  //char每个数据占1个字节
	//定义int数组存放转换得到的ARGB数据
	unsigned int lcdbuf[W*H]; //int每个数据占4个字节
	unsigned int tempbuf[W*H]; //int每个数据占4个字节
	
	//打开W*H大小的bmp图片
	bmpfd=open(argv[1],O_RDWR);
	if(bmpfd==-1)
	{
		printf("打开bmp失败!\n");
		return -1;
	}
	
	//打开lcd的驱动
	lcdfd=open("/dev/ubuntu_lcd",O_RDWR);
	if(lcdfd==-1)
	{
		printf("打开lcd失败!\n");
		return -1;
	}
	
	//映射得到lcd的首地址
	unsigned int *lcdmem=mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
	if(lcdmem==NULL)
	{
		printf("映射lcd失败!\n");
		return -1;
	}
	
	//跳过前面没有用的54个字节,从55字节开始读取真实的RGB
	lseek(bmpfd,54,SEEK_SET);
	
	//读取bmp的rgb数据,从图片的第55个字节开始读取
	read(bmpfd,bmpbuf,W*H*3);
	//bmpbuf[0] --》R
	//bmpbuf[1] --》G
	//bmpbuf[2] --》B
	//把三个字节的RGB--》转换成四个字节的ARGB
	//思路:用位或运算和左移实现数据拼接
	for(i=0; i<W*H; i++)
		lcdbuf[i]=bmpbuf[3*i]|bmpbuf[3*i+1]<<8|bmpbuf[3*i+2]<<16|0x00<<24;
	              // 00[2][1][0]  ABGR
				  // 00[5][4][3]
	/*	
		lcdbuf[0]--lcdbuf[799]放到    lcdmem---lcdmem+799
		lcdbuf[800]--lcdbuf[1599]放到 lcdmem+800---lcdmem+1599
	*/
	for(x=0; x<W; x++)
	{
		for(y=0; y<H; y++)
			tempbuf[(479-y)*W+x]=lcdbuf[y*W+x]
	}
	
	
	for(i=0; i<W*H; i++)
		*(lcdmem+i)=tempbuf[i];  //直接把ARGB数值往地址里面存放即可,效率最高

	//关闭
	close(bmpfd);
	close(lcdfd);
	//解除映射
	munmap(lcdmem,800*480*4);
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值