数据结构-排序

文章目录

  • 1. 排序的概念
  • 2. 常见排序算法的实现
    • 2.1 插入排序
      • 1)插入排序
        • 一)基本思想
        • 二)特性及时间复杂度
        • 三)代码实现
      • 2)希尔排序(缩小增量排序)
        • 一)基本思想
        • 二)特性及时间复杂度
        • 三)代码实现
    • 2.2 选择排序
      • 1)选择排序
        • 一)基本思想
        • 二)特性及时间复杂度
        • 三)代码实现
      • 2)堆排序
        • 一)基本思想
        • 二)特性及时间复杂度
        • 三)代码实现
    • 2.3 交换排序
      • 1)冒泡排序
        • 一)基本思想
        • 二)特性及时间复杂度
        • 三)代码实现
      • 2)快速排序
        • 一)基本思想
        • 二)特性及时间复杂度
        • 三)代码实现
          • hoare版本
          • 挖坑法
          • 前后指针版本
          • 非递归实现快排(利用栈)
    • 2.4 归并排序
      • 1)基本思想
      • 2)特性及时间复杂度
      • 3)代码实现
        • 递归思想
        • 非递归实现归并
  • 3. 非比较排序(计数排序)
    • 3.1 思想
    • 3.2 特性及时间复杂度
    • 3.3 代码实现
  • 4. 排序算法复杂度及稳定性分析

1. 排序的概念

排序: 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
内部排序: 数据元素全部放在内存中的排序。
外部排序: 数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

常见的排序算法有以下 7类

排序类别

2. 常见排序算法的实现

2.1 插入排序

1)插入排序

一)基本思想

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

插入排序

二)特性及时间复杂度

元素集合越接近有序,直接插入排序算法的时间效率越高

时间复杂度: O(N^2),最好的情况【顺序有序】:O(N)

空间复杂度: O(1),它是一种稳定的排序算法

稳定性: 稳定

三)代码实现
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; ++i){int end = i;// a[0]不需要排序int tmp = a[end + 1];while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}

2)希尔排序(缩小增量排序)

一)基本思想

先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

希尔排序

二)特性及时间复杂度

希尔排序是对直接插入排序的优化。

gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

希尔排序的时间复杂度不好计算,因为 gap 的取值方法很多,导致很难去计算,因此在好些书中给出的希尔排序的时间复杂度都不固定:

《数据结构(C语言版)》— 严蔚敏:

ywm

《数据结构-用面相对象方法与C++描述》— 殷人昆

yrk

因为下面的 gap 是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,大致估计为 O(N^1.3)

稳定性: 不稳定

三)代码实现

这里的 gap 取值才用 gap/3+1 的办法,让排序更快调用起来。

void ShellSort(int* a, int n)
{int gap = n;// gap > 1时是预排序,目的让他接近有序// gap == 1是直接插入排序,目的是让他有序while (gap > 1){//gap = gap / 2 + 1;gap = gap / 3 + 1;for (int i = 0; i < n - gap; ++i){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

2.2 选择排序

1)选择排序

一)基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

选择排序

二)特性及时间复杂度

直接选择排序效率不是很好,实际中很少使用

时间复杂度: O(N^2)

**空间复杂度: **O(1)

稳定性: 不稳定

三)代码实现

在上面的基础上,多增加一次交换,变成一次交换最大值和最小值分别到尾和头,同时,如果最大值就是在开头,会出现问题,因此加入判定 maxi == begin 要重新对 maxi 赋值。

void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = end;for (int i = begin; i < end; ++i){if (a[i] < a[mini])mini = i;if (a[i] > a[maxi])maxi = i;}Swap(&a[begin], &a[mini]);if (maxi == begin)maxi = mini;Swap(&a[end], &a[maxi]);++begin;--end;}
}

2)堆排序

一)基本思想

堆排序(是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据,需要注意的是排升序要建大堆,排降序建小堆。

堆排序

二)特性及时间复杂度

堆排序使用堆来选数,效率就高了很多

时间复杂度: O(NlogN)

空间复杂度: O(1)

稳定性: 不稳定

三)代码实现
void AdjustDown(int* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){// > 是建大堆if (child + 1 < size && a[child + 1] > a[child]){child++;}// > 是建大堆if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapSort(int* a, int n)
{// O(N)// 升序建大堆for (int i = (n - 1 - 1) / 2; i >= 0; --i){AdjustDown(a, n, i);}//O(NlogN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}

2.3 交换排序

1)冒泡排序

一)基本思想

根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

冒泡排序

二)特性及时间复杂度

冒泡排序是一种非常容易理解的排序

**时间复杂度: ** O(N^2)

空间复杂度: O(1)

稳定性: 稳定

三)代码实现

这里加入一个判定 exchange 进行判定,如果在中间发现有序,即该趟排序没有发生交换,就意味着数组已经有序,因此直接结束循环。

void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){bool exchange = false;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = true;}}if (exchange == false)break;}
}

2)快速排序

一)基本思想

任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

二)特性及时间复杂度

快速排序整体的综合性能和使用场景都是比较好的

时间复杂度: O(NlogN)

空间复杂度: O(logN)

稳定性: 不稳定

三)代码实现

将区间按照基准值划分为左右两半部分的常见方式有3个版本

hoare版本

该思路采用递归分治的思想,比 key 小或相等的值到左边,比 key 大或相等的值到右边,最后将 key 交换到中间,形成以 key 为分界的一小一大区域。同时继续对这一小一大区域再次重复此过程(递归),直到 begin >= end 就停止递归。

为什么相遇位置比 key 小?

因为右边先走,这样就会形成两种情况:

1)R遇到L: R没有找到比 key 小的值,直到遇到L停止,相遇位置是L,会比 key

2)L遇到R: R先走,找到小的停下来,L找大,没有找到,遇到R停下来,相遇位置是R,会比 key

因此相遇位置总会比 key 小,从而交换后保持左小右大的规则。如果 key 是尾,那么L先走也是一致的。

为了使 key 随机性,从而获取更好的性能(排序顺序时时间复杂度显著降低),将按照常规的办法,取头尾中三个数字进行比较,取中间的值作为 key 并交换到头部开始递归。

int GetMidi(int* a, int begin, int end)
{int midi = (begin + end) / 2;int max =a[begin] > a[end] ? begin : end;max = a[max] > a[midi] ? max : midi;int min = a[begin] > a[end] ? end : begin;min = a[min] > a[midi] ? midi : min;return begin + end + midi - max - min;
}

这个版本实现快速排序有很多坑!!

首先是 leftright 的初始值,其次是左右循环条件要设为 <= 或者 >= ,同时要加入判定条件,不让数组越界,并且相遇就停止。条件错一个,那么结果都是错的。

hoare

// end为数组最大下标
void QuickSort(int* a, int begin, int end)
{if (begin >= end)return;int left = begin, right = end;int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int keyi = begin;while (left < right){// 右边找小while (left < right && a[right] >= a[keyi]){--right;}// 左边找小while (left < right && a[left] <= a[keyi]){++left;}Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);QuickSort(a, begin, left - 1);QuickSort(a, left + 1, end);
}
挖坑法

该方法是对 hoare 的改进策略,先保存 key 的值,然后开始遍历(与 hoare 策略一致),右边R先走,找到一个比 key 小的值后,放入L的下标位置,然后L开始走,找到一个比 key 大的值后,放入到R的下标位置。相遇后,直接将 key 的值放入相遇位置。以此进行递归。

下面将一趟的代码分离,方便进行调用。

挖坑法

int PartSort2(int* a, int begin, int end)
{int left = begin, right = end;int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int key = a[begin];int hole = begin;while (left < right){// 右边找小,填到左边的坑while (left < right && a[right] >= key){--right;}a[hole] = a[right];hole = right;// 左边找大,填到右边的坑while (left < right && a[left] <= key){++left;}a[hole] = a[left];hole = left;}a[hole] = key;return hole;
}void QuickSort(int* a, int begin, int end)
{if (begin >= end)return;int keyi = PartSort2(a, begin, end);QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}
前后指针版本

因为 hoare 太多坑了,不方便使用,因此有人发明出前后指针的办法:

1)当 cur>key 时, ++cur

2)当 cur<key 时,++prev 然后交换 prevcur 的值,再 ++cur

3)当 cur>end 时,循环结束,交换 prevkeyi 的值,即最开始的值。

前后指针

int PartSort3(int* a, int begin, int end)
{int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int keyi = begin;int prev = begin;int cur = begin + 1;while (cur <= end){if (a[cur] < a[keyi] && ++prev != cur)Swap(&a[prev], &a[cur]);++cur;}Swap(&a[prev], &a[keyi]);keyi = prev;return keyi;
}void QuickSort(int* a, int begin, int end)
{if (begin >= end)return;int keyi = PartSort3(a, begin, end);QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}
非递归实现快排(利用栈)

这里要利用栈的特性,先把头位置放进栈,出栈就代表走一遍排序,然后可以拿到 keyi 的值,再将两边分别入栈,当 left < key-1 (表示不能等于自身或者大于自身)时,或者 right > keyi+1 (表示不能等于自身或者小于自身)时,重复此动作,直到结束。

这里不明确头尾哪个先入栈,但出栈顺序必须要匹配出栈的值

非递归实现快排

void QuickSortNonR(int* a, int begin, int end)
{ST s;STInit(&s);STPush(&s, end);STPush(&s, begin);while (!STEmpty(&s)){int left = STTop(&s);STPop(&s);int right = STTop(&s);STPop(&s);int keyi = PartSort3(a, left, right);if (left < keyi - 1){STPush(&s, keyi - 1);STPush(&s, left);}if (right > keyi + 1){STPush(&s, right);STPush(&s, keyi + 1);}}STDestroy(&s);
}

2.4 归并排序

1)基本思想

采用分治法的一个非常典型的应用,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

思想

2)特性及时间复杂度

归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

时间复杂度: O(NlogN)

空间复杂度: O(N)

稳定性: 稳定

3)代码实现

递归思想

采用后递归的方法,先分解,在逐一合并

归并排序

void _MergeSort(int* a, int begin, int end, int* tmp)
{if (begin >= end)return;// 后序递归(分解)int midi = (begin + end) / 2;_MergeSort(a, begin, midi, tmp);_MergeSort(a, midi + 1, end, tmp);// [begin, midi][midi+1, end]合并(归并)// 区间各只有一个元素即有序,往上依次后序归并int begin1 = begin, end1 = midi;int begin2 = midi + 1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2])tmp[i++] = a[begin1++];elsetmp[i++] = a[begin2++];}while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end2){tmp[i++] = a[begin2++];}memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail\n");exit(-1);}_MergeSort(a, 0, n - 1, tmp);
}
非递归实现归并

这个思路就是,首先将 gap=1 ,即拆分成最小单位,之后就是完成一趟一趟的归并,每一趟结束后将 gap*2 ,就控制归并的组别。

这里需要注意的是,要防止 end1/begin2/end2 越界,因此对其进行判定。其次每排完一次都要进行 memcpy 操作,不然的话没有更新到原数组,后面的( gap 增加后)排序就可能会出错。

非递归归并

void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail\n");exit(-1);}int gap = 1;while (gap < n){for (int i = 0; i < n - gap; i += gap * 2){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + gap * 2 - 1;// 防止越界if (end1 >= n || begin2 >= n)return;if (end2 >= n)end2 = n - 1;int k = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2])tmp[k++] = a[begin1++];elsetmp[k++] = a[begin2++];}while (begin1 <= end1){tmp[k++] = a[begin1++];}while (begin2 <= end2){tmp[k++] = a[begin2++];}memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;}free(tmp);
}

3. 非比较排序(计数排序)

3.1 思想

计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤:

1)统计相同元素出现次数

2)根据统计的结果将序列回收到原来的序列中

计数排序

3.2 特性及时间复杂度

计数排序在数据范围集中时,效率很高,但是适用范围及场景有限,不适合分散的数据,不适合浮点数、字符串、结构体数据排序,只适合整数

时间复杂度O(MAX(N,范围))

**空间复杂度: ** O(范围)

稳定性: 稳定

3.3 代码实现

void CountSort(int* a, int n)
{int min = a[0], max = a[0];for (int i = 1; i < n; ++i){if (min > a[i])min = a[i];if (max < a[i])max = a[i];}int range = max - min + 1;int* count = (int*)calloc(range, sizeof(int));if (count == NULL){perror("ralloc fail\n");exit(-1);}for (int i = 0; i < n; ++i){// 相对映射统计a数组中每个数据出现的次数count[a[i] - min]++;}int j = 0;for (int i = 0; i < range; ++i){while (count[i]--){a[j++] = i + min;}}free(count);
}

4. 排序算法复杂度及稳定性分析

对每个算法进行分析:

分析1

分析2

以上就是排序的全部内容啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38296.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

压缩壳学习

壳是什么 壳就是软件的一个保护套&#xff0c;防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的&#xff1b;加密壳&#xff0c;通过加密软件来保护软件&#xff…

《AI大模型趣味实战》第6集:基于大模型和RSS聚合打造个人新闻电台

《AI大模型趣味实战》第6集&#xff1a;基于大模型和RSS聚合打造个人新闻电台 摘要 本文将带您探索如何结合AI大模型和RSS聚合技术&#xff0c;打造一个功能丰富的个人新闻电台系统。我们将使用Python和PyQt5构建一个桌面应用程序&#xff0c;该应用可以从多个RSS源抓取新闻&…

(学习总结29)Linux 进程概念和进程状态

Linux 进程概念 冯诺依曼体系结构软件运行与存储分级数据流动的理论过程 操作系统操作系统(Operator System) 概念操作系统的功能与作用系统调用和库函数概念 进程概念描述进程 - PCBtask_struct查看进程通过系统调用获取进程标示符 PID通过系统调用 fork 函数创建进程简单使用…

LLM - CentOS上离线部署Ollama+Qwen2.5-coder模型完全指南

文章目录 离线安装OllamaOllama下载Ollama硬件需求Ollama 常用命令参考Ollama安装Ollama 服务管理&开机启动开启局域网访问 Ollama 服务 离线安装模型gguf 文件格式下载Qwen2.5-Coder-7B-Instruct-GGUF格式选择 ( gguf 版本 )构建Modelfile文件加载并运行离线模型测试 集成…

Linux——信号

目录 Linux——信号1.信号的基础了解2.技术应用角度的信号3.产生信号3.1按键组合3.2系统调用产生信号3.2.1 kill()3.2.2 raise()3.2.3 abort() 3.3**.** 软件条件产生信号3.4硬件异常产生信号3.4.1 /0异常3.4.2 内存越界异常 4.理解信号的存在5.总结一下6.核心转储7.全部信号都…

向量叉积的应用——正反画画

1 解题思路 解题思路涉及的向量积相关知识 c实现 #include<iostream> #include<vector>using namespace std;struct TrianglePoint {int x;int y; };int momentForce(TrianglePoint A, TrianglePoint B, TrianglePoint C) {//AB向量&#xff1a;(B.x-A.x, B.y-A.…

构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据

构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据 概述 本文将指导开发者构建一个MCP(Model Control Protocol)天气服务器,通过暴露get-alerts和get-forecast工具,为Claude for Desktop等客户端提供实时天气数据支持。该方案解决了传统LLM无法直接获取天气…

Web安全策略CSP详解与实践

引言 &#xff1a;在黑客攻击频发的今天&#xff0c;你的网站是否像“裸奔”一样毫无防护&#xff1f;跨站脚本&#xff08;XSS&#xff09;、数据注入等攻击随时可能让用户数据泄露。今天我们将揭秘一个网站的隐形保镖——内容安全策略&#xff08;CSP&#xff09;&#xff0c…

HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述

这个是上一年的项目&#xff0c;之前弄得不怎么完整&#xff0c;只有一个openmv的&#xff0c;所以openmv自己去我主页找&#xff0c;这篇主要讲蓝牙 这个是我在使用openmv连接单片机1然后单片机1与单片机2通过蓝牙进行通信 最终实现的效果是&#xff1a;openmv识别到图形和数…

点云分割方法

点云分割 通过判断三维距离&#xff0c;实现对创建3团点云的分割 通过判断三维距离&#xff0c;实现对创建3团点云的分割 * 点云1 gen_object_model_3d_from_points (rand(100), rand(100),rand(100), Points1)* 点云2 gen_object_model_3d_from_points (rand(100), 2rand(100…

SpringBoot3使用CompletableFuture时java.util.ConcurrentModificationException异常解决方案

问题描述 在Spring Boot 3项目中&#xff0c;使用CompletableFuture进行异步编程时&#xff0c;偶发{"code":500,"msg":"java.util.ConcurrentModificationException"}异常&#xff0c;但代码中并未直接操作List或CopyOnWriteArrayList等集合类…

细说卫星导航:测距定位原理

测距定位原理 1. 伪距测量技术 核心原理&#xff1a;卫星发射信号&#xff0c;用户接收并记录传播时间&#xff0c;乘以光速得到距离&#xff08;伪距&#xff09;。 技术细节&#xff1a; 信号传播路径分析 信号结构&#xff1a; 卫星信号包含三部分&#xff1a; 载波&…

Linux系统管理与编程09:任务驱动综合应用

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 [环境] windows11、centos9.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境&#xff1a;Lamp&#xff08;linux httpd mysql8.0 php&#xff09; [步骤] 5 …

RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”

嘿&#xff0c;亲爱的算法工程师们&#xff01;今天咱们聊一聊PDF解析的那些事儿&#xff0c;简直就像是在玩一场“信息捉迷藏”游戏&#xff01;PDF文档就像是个调皮的小精灵&#xff0c;表面上看起来规规矩矩&#xff0c;但当你想要从它那里提取信息时&#xff0c;它就开始跟…

RK3568 I2C底层驱动详解

前提须知&#xff1a;I2C协议不懂的话就去看之前的内容吧&#xff0c;这个文章需要读者一定的基础。 RK3568 I2C 简介 RK3568 支持 6 个独立 I2C: I2C0、I2C1、I2C2、I2C3、I2C4、I2C5。I2C 控制器支持以下特性: ① 兼容 i2c 总线 ② AMBA APB 从接口 ③ 支持 I2C 总线主模式…

UNIX网络编程笔记:基本TCP套接字编程

一、socket函数 一、socket函数核心参数与协议组合 函数原型与基本功能 #include <sys/socket.h> int socket(int family, int type, int protocol);• 功能&#xff1a;创建通信端点&#xff08;套接字&#xff09;&#xff0c;返回描述符供后续操作。 • 返回值&#…

JSON在AutoCAD二次开发中应用场景及具体案例

配置文件的读取 在AutoCAD插件开发中&#xff0c;可能需要生成、修改、读取配置文件中一些参数或设置。JSON格式的配置文件易于编写和修改&#xff0c;且可以方便地反序列化为对象进行使用。 运行后效果如下 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.Au…

自由学习记录(46)

CG语法的数据类型 // uint : 无符号整数&#xff08;32位&#xff09; // int : 有符号整数&#xff08;32位&#xff09; // float : 单精度浮点数&#xff08;32位&#xff09;&#xff0c;通常带后缀 f&#xff08;如 1.0f&#xff09; // half : 半精度浮…

解决Selenium滑动页面到指定元素,点击失效的问题

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:君失臣兮龙为鱼&#xff0c;权归臣兮鼠变虎&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4…

Vue基础

目录 -Vue基础- 1、插值表达式 {{}} 2、Vue核心特性&#xff1a;响应式 3、开发者工具Vue Devtools(极简插件下载) 4、Vue指令 v-text v-html v-bind v-on v-if v-show v-for v-model 5、Vue指令修饰符 .stop .prevent .capture .self .once .enter、.tab、…