学习记录day18——数据结构 算法

ops/2024/10/21 13:42:46/

算法的相关概念

        程序 = 数据结构 + 算法

算法是程序设计的灵魂,结构式程序设计的肉体

算法:计算机解决问题的方法护额步骤

算法的特性

1、确定性:算法中每一条语句都有确定的含义,不能模棱两可

2、有穷性:程序执行一段时间后会自动结束

3、输入:有零个或多个输入

4、输出:至少一个输出,可输出多个

5、可行性:经济可行性、社会可行性、能够运行

算法的设计要求

1、正确性:给定合理的输入数据能够得到正确的结果

2、健壮性:对于给定的不合理的输入数据,能够给出相应的处理措施

3、可读性:程序核心代码写注释、程序代码有缩进、程序代码命名规范

4、高效率:要求设计复杂度尽可能低

5、低存储:要求空间复杂度尽可能低

时间复杂度

算法执行消耗时间的度量 

计算公式:T(n) = O(f(n));

        T(n):时间复杂度
        n:表示问题的规模
        f(n):是问题规模与执行次数之间的函数
        O(f(n)):使用O阶记法,记录算法时间复杂度

常见的数据复杂度

排序算法 

        根据数据元素的关键字,按照升序或降序的方式将数据元素重新排列的过程称为排序

排序的分类

1、交换类:冒泡排序、快速排序

2、选择类:简单选择排序、堆排序

3、插入类:直接插入排序、折半插入排序

4、归并类:二路归并、多路归并

冒泡排序

1、在排序过程中,越大(小)的数据,经由交换后,会慢慢的“浮”到顶端,如同气泡一样

2、冒泡排序原理

        1)比较相邻元素,如果第一个比第二个大(小)则交换

        2)经过一趟排序后会使最大(最小)的元素落到最后 重复上面的步骤,直到没有任何一对                  数字需要比较为止

        3)当某一趟的排序过程中,出现没有数据交换的过程,则结束整个排序

3、算法


void bubble_sort(int *arr, int n)
{for (int i = 1; i < n; i++)         //外循环  控制趟数   {int flag = 0;                   //定义一个标志位  及   标准位重置for (int j = 0; j < n - i; j++) //内循环  交换位置{if (arr[j] > arr[j+ 1])     //判定是否交换(升序排列){flag = 1;               //标志位 置1int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}if (flag == 0)       //标志位为0 说明未进入if语句 即排列已完成 直接退出循环{break;}}printf("bubble_sort on\n");
}

选择排序

        每次从待排序序列中,找到最大(小)值,将其与待排序序列的第一个进行交换

1、排序步骤:

        1)从待排序序列中选择最值

        2)如果最值不是待排序序列的第一个,则进行交换

        3)从剩余待排序序列中,继续重复前两次的操作,直到,待排序序列为空

2、算法

void select_sort(int *arr, int n)
{int min = 0;     //定义一个变量 存储最小值for (int i = 0; i < n; i++){min = i;    //记录下标for (int j = i + 1; j < n; j++){if (arr[min] > arr[j])  //更新最小值{min = j;}}if (min != i)          //如果最小值不是待排序序列第一个 则换置换{int temp = arr[min];arr[min] = arr[i];arr[i] = temp;}}printf("select_sort on\n");
}

直接插入排序

每次从待排序序列中,选择第一个,将其插入到已排序序列中

1、排序步骤

        1)选取待排序序列中的第一个元素

        2)跟前面的元素依次比较,如果前面的比当前元素大(小),则将前面的元素后移一位

        3)直到出现前面的不比当前的大(小)或者已经到最前面了,将选取的元素,放入空位置上

        4)对于待排序序列中的所有元素,重复上述操作

2、算法

        

void insert_sort(int *arr),int n
{int i,j;                     //需要在循环外使用for (i = 1; i < n; i++){int temp = arr[i];      //记录要移动的元素数值    for ( j = i-1; temp= < arr[j] && j >= 0;  j--)   //实现的效果:                                                                           {                                                //如果记录的数值小于等于已排列序列arr[j+1] = arr[j];                           //中的某个数,从那个数开始整体后移}                                                //但实际上是逐个比较,逐个后移arr[j+1] = temp;                                 //后移结束 插入记录的元素数值                                 }printf("insert_sort on\n");
}

快速排序

        快速排序是在序列元素与选定基准元素比较分割为大小两部分的交换排序

        时间复杂度:O(nlog2n)    n倍以2为底2的对数

1、排序步骤

        1)从待排序列中任取一个基准元素

        2)与基准元素比较将待排序列分割为大小两部分

        3)再对各部分重新选择基准元素并依此规则排序 直到每个部分只剩一个元素为止

 2、算法

int part(int *arr,int low ,int high)
{int X = arr[0];        //将第一个元素定为基准while(low < high)      //循环条件{while (low < high && arr[low] >= X)   //避免错位   {high--;}arr[low] = arr[high];     //将小值前置while (low < high && arr[high] =< X){low++;}arr[high] = arr[low];     //将大值后置}//循环结束  此时 low == higharr[low] = X;   //将基准放入指定位置return low;  //返回基准下标
}
void quick_sort(int *arr ,int low ,int high)
{if (low => high)   {return;    //递归出口   只有一个元素时}int mid = part(arr,low,high);  //找到基准quick_sort(arr,low,mid-1);   //对较小端进行递归quick_sort(arr,mid+1,high);  //对较大端进行递归return ;
}


http://www.ppmy.cn/ops/89041.html

相关文章

python中的字符串方法

python中的字符串 举个例子先 name = 貂蝉开大 #声明了一个字符串 print(name) # 打印了一个字符串 print(name[0:1] #输出貂蝉 print(name[2:3] #输出开大 扩展方法 find() # 查找字符串中某个字符的索引 index_ = name.find("貂") print(index_) # 输出 …

Stable Diffusion基本原理通俗讲解

Stable Diffusion是一种基于深度学习的图像生成技术&#xff0c;它属于生成对抗网络&#xff08;GANs&#xff09;的一种。简单来说&#xff0c;Stable Diffusion通过训练一个生成器&#xff08;Generator&#xff09;和一个判别器&#xff08;Discriminator&#xff09;&#…

银河麒麟无法获得锁,锁由进程持有的解决方法

解决方法有两种 方法一&#xff1a;杀死进程 执行如下代码&#xff0c;2234换成字节的进程号 sudo kill 2234方法二&#xff1a;强制解锁 删除进程锁的缓存文件&#xff0c;强制解锁 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock我用的时候第一种方法…

MyBatis动态SQL

目录 1、动态SQL &#xff08;1&#xff09;什么是动态SQL? &#xff08;2&#xff09;常用的动态SQL元素 2、if元素 3、choose 、when 、otherwise元素 &#xff08;1&#xff09;为什么使用choose元素 &#xff08;2&#xff09;choose元素的功能 4、trim 、where …

02 Go语言开发REST API接口_20240728 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础 基础不好的同学每节课的代码最好配合视频进行阅读和学习&#xff0c;如果基础比较扎实&#xff0c;则阅读本教程巩固一下相关知识点即可&#xff0c;遇到不会…

MinGW-w64编译安装Acise

Acise(A CAx Industrial Software Ecology)是一款跨平台的CAx软件开发框架&#xff0c;本文记录在Windows下编译安装Acise的流程。 零、环境 操作系统Windows11Visual Studio CodeVisual Studio Code 1.92.0CMakeCMake 3.24.2GitGit version 2.45.2.windows.1MSYS2msys2-x86_6…

Python面试宝典第26题:最长公共子序列

题目 一个字符串的子序列是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何字符&#xff09;后组成的新字符串。比如&#xff1a;"ace" 是 "abcde" 的子序列&#xff0c;但 "…

EasyAR_稀疏空间图

EasyAR_稀疏空间图 EasyAR4.6.3 丨 Unity2020.3.15f2 1.创建稀疏空间地图 在EasyAR开发中心后台创建Scene许可证密钥&#xff0c;并且使用稀疏空间地图 2.设置稀疏空间地图库名&#xff0c;对稀疏空间地图进行管理&#xff0c;设置密钥 3.复制密钥到Unity中 添加Spatial Map Ap…