news 2026/4/18 3:24:59

冒泡排序、选择排序与字典及 var、dynamic 区别总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
冒泡排序、选择排序与字典及 var、dynamic 区别总结

本文介绍了冒泡排序和选择排序的核心逻辑与实现,以及C#中Dictionary字典的使用方法。冒泡排序通过相邻元素比较交换将最大值"冒泡"到末尾,选择排序则通过选择最值元素与未排序区间首元素交换。Dictionary字典通过键值对存储数据,支持高效查找和修改操作。最后对比了var和dynamic类型的区别:var首次赋值确定类型后不可更改,而dynamic类型在运行时动态解析且可随时变更类型。文章还简要提及了强类型和弱类型编程语言的特点。

冒泡排序

核心逻辑:

重复遍历排序序列,相邻元素两两相比,如果前面的元素大于后面的元素这个时候交换位置。

每一轮遍历会将当前未排序部分的最大元素 “冒泡” 到末尾;

重复上述过程,直到所有元素有序(从小到大,或从大到小)

例子:

List<int> list = new List<int>() { 1, 99, 2, 7, 11, 5, 28, 14 }; // 外层循环:控制排序轮数 //原理:n个元素最多需要n-1轮排序(因为每轮确定1个最值的位置,最后1个元素无需再轮询) for (int i = 0; i < list.Count-1; i++) { for (int j=0;j<list.Count-1-i;j++) // 内层循环:每轮遍历未排序区间,相邻元素比较+交换 { if (list[j] > (list[j+1]))// 比较相邻位置交换位置 如果前面的大则交换位置 { int temp = list[j];// 定义一个临时值 存储前一个元素的值 list[j] = list[j + 1];// 后一个元素前移,覆盖前一个元素 list[j + 1] = temp;// 临时变量的值赋给后一个元素,完成交换 } } }

选择排序

核心逻辑:

将序列分为已排序区间未排序区间,每一轮从未排序区间中找到最值(升序最小值降序最大值),将其与未排序区间的第一个元素交换位置;重复此过程,直到未排序区间为空。

简单来说,选择排序的核心是 “先选最值,再交换”,而非冒泡排序的 “相邻交换、逐步冒泡”。

代码:

List list=new List() { 1,23,5,3,77,44,6,7,8,9}; for (int i=0;i<list.Count-1;i++) { int minIndex = i;//每一轮循环的 把i当成最小值的索引值 for (int j = i+1; j < list.Count; j++) { //取出最小值索引:list[minIndex],如果其中的一个元素比最小值还小,这时候list[j]最小值 if (list[minIndex] > list[j]) { minIndex = j; } } //在内循环外部进行交换位置 if (i!=minIndex)//如果找到的最小的和初始化的赋值的最小的不一样进行交换 { //list[minIndex] 和list[i]进行交换 object temp = list[i]; list[i] = list[minIndex];//最小值赋值给当前遍历的元素 已经排序的末尾 list[minIndex] = temp; } } //.join()把参数2的数组用参数1的符号进行拼接成一个字符串 Console.WriteLine(string.Join(", ",list));

Dictionary字典

字典:包含了key(键)和value(值) 简称为键值对,键是唯一的,值可以是任意类型的,字典是没有顺序的,只能通过键取值

使用场景:当你有一组数据,每个数据都有唯一标识(键),且需要频繁通过这个标识查找对应数据时,优先用字典。

对比列表:列表查找元素需遍历所有元素,字典直接通过键定位,效率天差地别。

例子

1.字典键值对的初始化方式

//方法一 索引式([key] = value):底层是索引赋值,重复键覆盖值(无异常); Dictionary<int, string> dic1 = new Dictionary<int, string>() { [123124] = "王五",//参数1键唯一,参数2是值 }; //方法二 集合初始化器(集合式)([key] = value):底层是 Add,重复键抛异常; Dictionary<int, string> dic2 = new Dictionary<int, string>() { {321,"张三" },//参数1键唯一,参数2是值 {123,"李四" }, }; //方法三 向字典添加元素 Dictionary<string, string> dic3 = new Dictionary<string, string>(); dic3.Add("老六", "男");//参数1键唯一,参数2是值 dic3.Add("赵一", "男");

2.取出值

Dictionary<int, string> dic = new Dictionary<int, string>() { [123124] = "王五",//参数1键唯一,参数2是值 }; Console.WriteLine(dic["news1"]); //根据键取出值 Console.WriteLine(dic.Values); //获取所有的值的集合 Console.WriteLine(string.Join("-",dic.Values)); foreach (var item in dic.Values) { Console.WriteLine(item); }

3.取出键

Dictionary<int, string> dic = new Dictionary<int, string>() { [123124] = "王五",//参数1键唯一,参数2是值 }; Console.WriteLine(dic1.Keys);//获取所有键的集合 Array.ForEach(dic.Keys.ToArray(),v=> Console.WriteLine(v+"////")); //dic,Keys.ToArray()转成数组类型

4.修改值

Dictionary<string, string> dic = new Dictionary<string, string>() { ["王五"] = "男", }; dic["王五"] = "女";

5.根据键进行删除

Dictionary<string, string> dic = new Dictionary<string, string>() { ["王五"] = "男" }; dic.Remove("王五");

6.清空集合

Dictionary<string, string> dic = new Dictionary<string, string>() { ["王五"] = "男" }; dic.Clear();

7.是否包含news3键

Dictionary<string, string> dic = new Dictionary<string, string>() { ["王五"] = "男" }; Console.WriteLine(dic.ContainsKey("王五"));

8. 取出字典所有的键值对,使用foreach循环先遍历键 再根据键获取值

Dictionary<string, string> dic = new Dictionary<string, string>() { ["王五"] = "男", ["张三"] = "男", ["李思"] = "女", }; foreach (var item in dic.Keys) { Console.WriteLine($"名字:{iten} ,性别:{dic[item]}); //根据键来获得对应的值 }

var和dynamic的区别

var(隐式类型)

var 可以接收任意类型的数据,变量的实际类型由首次赋值的值的类型确定类型,且一旦确定,后续不能更改为其他类型。

用 var 替代具体类型关键字,无需手动指定变量类型。

示例:

var i = 10; //int 类型 var str = "张三";//string 类型 //后续对str赋其他类型的值,会报错 //str = 20; 报错

dynamic(动态类型):无“首次赋值定类型” 的规则,真正支持接收任意类型数据 —— 变量类型不绑定到某一个值,仅在程序运行时根据当前赋值动态解析,且可随时变更类型(比如 dynamic a=10 之后,再赋值 a="hello" 完全合法,无编译错误)。

dynamic:类型完全可变,赋值无任何类型限制,同一变量可先后接收整数、字符串、布尔值等不同类型的值。

//dynamic 动态类型定义,也可以接收任意类型的数据 dynamic name = "world"; dynamic i= 10; i= "hello"; Console.WriteLine(name);

强类型编程语言:定义一个数据 一旦确定数据的类型,这个数据不能在赋值成其他类型 好处:类型安全 ,坏处需要类型的转换
C#强类型语言

弱类型编程语言:定义一个数据 以后的代码可以修改数据的类型 坏处:类型不安全 。好处不需要类型的转换
js弱类型

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 16:36:48

QD框架模板订阅系统:5分钟快速获取海量自动化脚本资源

想要实现HTTP定时任务的零基础快速搭建&#xff1f;QD框架的公共模板订阅系统为您提供了完美的解决方案&#xff01;这个基于HAR编辑器和Tornado服务端的HTTP定时任务自动执行Web框架&#xff0c;通过智能的模板订阅机制&#xff0c;让您轻松拥有丰富的自动化脚本库&#xff0c…

作者头像 李华
网站建设 2026/4/18 1:50:02

手把手教你用Conda搭建Stable Diffusion 3.5 FP8环境(含CUDA安装)

手把手教你用 Conda 搭建 Stable Diffusion 3.5 FP8 环境&#xff08;含 CUDA 安装&#xff09; 在消费级显卡上流畅生成 10241024 分辨率的高质量图像&#xff0c;曾经是许多 AI 创作者遥不可及的梦想。随着 Stable Diffusion 3.5 FP8 版本的发布&#xff0c;这一目标终于变得…

作者头像 李华
网站建设 2026/4/4 11:54:31

PyTorch模型加载FP8权重失败?常见错误代码及修复方法汇总

PyTorch模型加载FP8权重失败&#xff1f;常见错误代码及修复方法汇总 在生成式AI快速落地的今天&#xff0c;Stable Diffusion 已从研究项目演变为工业级内容生产工具。越来越多的企业尝试将 stable-diffusion-3.5-fp8 这类高性能量化模型部署到线上服务中——它能在几乎不牺牲…

作者头像 李华
网站建设 2026/4/15 9:08:00

15分钟搭建paraphrase-multilingual-minilm-l12-v2文本改写原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个paraphrase-multilingual-minilm-l12-v2模型的文本改写原型&#xff0c;支持用户输入文本并选择目标语言&#xff0c;实时生成改写结果。要求使用轻量级框架&#xff0…

作者头像 李华
网站建设 2026/4/12 10:23:34

解密GPT的“续写”魔法:自回归模型

当你和AI聊天时&#xff0c;它回答的每句话&#xff0c;其实都是一个字一个字“猜”出来的。它只做一件事&#xff1a;根据已经说出的所有字&#xff0c;猜出下一个最可能的字。 你问&#xff1a;“今天天气&#xff1f;” AI心里在猜&#xff1a;看到“今天天气” → 猜下一个…

作者头像 李华
网站建设 2026/4/17 9:54:23

Windows 11远程桌面多用户配置指南:RDP Wrapper完整教程

还在为Windows 11只能单用户远程连接而烦恼&#xff1f;RDP Wrapper Library这款开源工具能够帮你轻松实现多用户同时远程访问功能&#xff0c;让家庭版系统也能享受企业级的远程桌面体验。无论你是IT管理员、开发者还是普通用户&#xff0c;这份完整配置手册都将为你提供简单实…

作者头像 李华