第一节课:8.9:数据结构与算法基础

第一节课:8.9:数据结构与算法基础

一、数据结构基础:

1.什么是数据结构:

数据结构是计算机存储、组织数据的方式,是指相互之间存在的一种或者多种特定的关系的数据元素的集合。

2.为什么要学习数据结构:

通过精心选择的数据结构可以带来更高的运行或存储效率

3.数据结构可以分为两个层次:逻辑结构和物理结构

(1)逻辑结构:大概理解是什么数据元素间抽象化的相互关系,与数据的存储无关,独立于计算机,它是从具体问题抽象出来的数学模型。反映数据元素之间的逻辑关系。(一般与与前驱和后继相关)比如:树:至多一个直接前驱,n个直接后继;线性表:只能有一个直接前驱和一个直接后继

线性结构:线性表、栈、队列(抽空复习一下这三个知识点)

非线性结构:树

(2)物理结构:

顺序存储结构:顺序表(数组),依次连续存储
链式存储结构:链表,在内存中的数据可以按照次序进行连续存储,也可以不连续存储,通过指示元素存储地址的指针来表示元素之间的逻辑关系

二、冒泡排序,选择排序:

1.优化前的两种排序:

void Choose(int arr[],int len)//复习一下arr[]和int* arr的区别???
{
	for (int i = 0; i < len - 1; ++i)//++i和i++的区别理解不透???为什么前者效率更高???//效率上没有区别
	{
		for (int j = i + 1; j < len; ++j)//内循环,i和j从第i的后面一个比到最后一个,把最小的排在第一个
		{
			if (arr[i] > arr[j])
			{
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

void MaoPao(int arr[],int len)
{
	for (int i = 0; i < len - 1; ++i)//外循环:冒泡的次数
	{
		for (int j = 0; j < len - i -1; ++j)//内循环:每一次都要从第一个数开始比较,1-2,2-3...,把最大的数冒泡到最后面
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

2.优化后的两种排序:

1.for (int j = i + 1; j < len; ++j)//每次都向栈重新申请空间,不如定义全局变量,只要申请一次即可
    2.int temp = arr[i];//同理;
    3.以前在c中学过交换两个数的一种较高效率的方式,这里也可以用上
//以冒泡为例修改:提高效率
        void MaoPao(int arr[],int len)
{
	int j = 0;
	for (int i = 0; i < len - 1; ++i)//外循环:冒泡的次数
	{
		for (j = 0; j < len - i -1; ++j)//内循环:每一次都要从第一个数开始比较,1-2,2-3...,把最大的数冒泡到最后面
		{
			if (arr[j] > arr[j + 1])
			{
				arr[j] = arr[j] ^ arr[j + 1];
				arr[j + 1] = arr[j + 1] ^ arr[j];
				arr[j] = arr[j] ^ arr[j + 1];
			}
		}
	}
}
        

3.写代码过程中的收获:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NlYicfcO-1630465896968)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20210809223146637.png)]

以前写的有关数组的排序的代码时候出现过这种错误,记得当时找了很久才弄明白是数据越界的错误;今天复习的时候,又出现了同样的错误,但是很快的便可以知道出错的原因,数组越界,很快的修正好了错误。体会到了经验的重要性,要多加练习,孰能生巧。

三、二分查找:(使用对象:顺序表,已序)

1.先写框架

int Binary_search(int arr[], int len, int findval)//先把大体的流程(框架)写出来
{
	int mid = 0;
	mid = len / 2;
	while ()
	{
		if (arr[mid] == findval)
			return mid;
		if (arr[mid] > findval)//在左半部分
		{

		}
		if (arr[mid] < findval)//右半部分
		{

		}
	}
}

2.老师的算法:

int binary_search(int arr[], int len, int findval)
{
	int mid = 0;
	int right = len - 1;
	int left = 0;
	while (left <= right)
	{
		mid =  left + (right - left)/ 2;//设置左右的值,每次改变左右端点的位置
		if (arr[mid] == findval)
			return mid;
		if (arr[mid] > findval)// 左半部分
		{
			right = mid - 1;
		}
		if (arr[mid] < findval)// 右半部分
		{
			left = mid + 1;
		}
	}
	return -1;
}

3.我的算法:

int Binary_search(int arr[], int len, int findval)//先把大体的流程(框架)写出来
{
	int mid = 0;
	mid = len / 2;//mid = mid>>2;
	while (1)
	{
		if (arr[mid] == findval)
			return mid;
		if (mid != 0 && mid != len - 1)
		{
			if (arr[mid] > findval)//在左半部分
			{
				//mid的值一直没有变化;所以要更新mid的值
				mid = mid / 2;//优化:mid = (mid >>  2);
			}
			if (arr[mid] < findval)//右半部分
			{
				mid = (mid + len) / 2;//mid = (mid + len) >> 2;
			}
		}
		else
			return -1;
	}
}

四、算法简介:重点掌握算法的分析方法

1.算法的概念:

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。它代表着用系统的方法描述解决问题的策略机制。

2.算法特征:

1.输入项

2.输出项

3.确定性

4.有穷性

5.有效性

3.算法的评价:

1.正确性

2.高效性(时间复杂的和空间复杂度)

3.健壮性

4.可读性

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值