【C/C++数据结构 - 1】:数据结构与算法基础

文章目录

数据结构

数据结构是随着计算机科学的发展而建立起来的围绕非数值计算问题的一门科学,是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合。

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

首先建立问题的数据模型:

数据的组成结构,数据的关联方式,以及实施相应运算后,数据组成结构的完整性。

完整性:

即是指不因对数据运算而改变数据模型的性质。设计相应的算法,需要保证结构的完整性前提下,以相同规律进行的。

数据结构可以分成两个层次

  1. 逻辑结构:
    数据元素间抽象化的相互关系,与数据的存储无关,独立于计算机,它是从具体问题抽象出来的数学模型。反映数据元素之间的逻辑关系。
    • 线性结构:有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个后继。比如:线性表、栈、队列等
    • 非线性结构:一个结点可能有多个直接前趋和直接后继。比如:树、图等
  2. 存储结构(物理结构):
    数据元素及其关系在计算机存储器中的存储方式。
    • 顺序存储结构:在内存中数据按顺序依次连续存储。比如:数组
    • 链式存储结构:在内存中数据可以按次序进行连续存储,也可以不连续存储,通过指示元素存储地址的指针来表示数据元素之间的逻辑关系。比如:链表
    • 以上2种不同的存储结构在进行数据结构的操作时会导致不一样的操作复杂度。

算法基础

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

在 C/C++ 中,算法有以下一些特征:

  1. 效率:C/C++ 是一种低级语言,直接操作内存,所以算法可以高效地处理大规模数据。算法的效率是衡量其好坏的重要标准。
  2. 灵活性:C/C++ 为算法提供了很大的灵活性。开发者可以根据具体需求选择不同的算法,并通过自定义函数和数据结构实现自己的算法。
  3. 模块化:C/C++ 的模块化特性使得算法的实现变得简单明了。开发者可以将复杂的算法划分为多个模块,每个模块负责不同的功能,便于理解和维护。
  4. 多样性:C/C++ 提供了丰富的算法库和函数,涵盖了各种常见的算法问题,如排序、搜索、图算法等。开发者可以直接使用这些库函数,提高开发效率。
  5. 可移植性:C/C++ 是一种跨平台的编程语言,算法在不同的操作系统和硬件平台上都可以运行。这为开发者在不同环境下使用算法带来了便利。

算法评价:

  1. 正确性:毫无疑问,一个算法的最基本条件就是正确。
  2. 高效性(时间复杂度&空间复杂度):对于一个算法来说,效率问题是绕不开的,我们需要对一个已经实现的算法进行不断的优化。
  3. 健壮性:算法也有多结局,所以每一个结局我们都要做处理。
  4. 可读性:算法不是为了为难他人而设计,反之,一个好用的算法它必须具备一个特性,就是容易理解。

冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

cpp 复制代码
#include<stdio.h>

//冒泡排序
void Bubble_Sort(int arr[], int size) //升序
{
	for (int i = 0; i < size - 1; i++)
	{
		for (int j = 0; j < size - 1 - i; j++)
		{
			if (arr[j]>arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。

它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

cpp 复制代码
//选择排序
void Select_Sort(int arr[], int size) //升序
{
	for (int i = size - 1; i > 0; i--)
	{
		for (int j = i - 1; j >= 0; --j)
		{
			if (arr[i] < arr[j])
			{
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。

但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列(已序)。

工作原理是:将要查找的元素一分为两半然后一半一半的查找。

cpp 复制代码
//二分查找
int Binary_Search(int arr[], int len, int findVal)
{
	int left = 0, right = len - 1;
	int mid; //中位数
	while (left <= right)
	{
		//第一步:确定中位数
		mid = left + ((right - left) >> 1); //(right - left) >> 1 等价于 (right - left)/2
		//第二步:和目标值比较
		if (findVal == arr[mid])
			return mid;
		else if (findVal > arr[mid])
			left = mid + 1;
		else if (findVal < arr[mid])
			right = mid - 1;
	}
	return -1; //找不到,返回不存在的下标值
}
相关推荐
郝学胜_神的一滴10 小时前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天1 天前
C++ 基础入门完全指南
c++
CSharp精选营2 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK3 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境3 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境3 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴4 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
刘马想放假5 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠6 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法