第一节课: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.可读性