十个排序算法

news2024/11/20 4:52:58

目录

冒泡排序(Bubble Sort)

选择排序(Select Sort)

插入排序(InsertSort)

希尔排序(ShellSort)

计数排序(CountSort)

快速排序(QuickSort)

归并排序(Merge Sort)

堆排序(Heap Sort)

桶排序(Bucket Sort)

基数排序(Radix Sort)

总结


冒泡排序(Bubble Sort)

例如:2,32,4,45,6,334,1,33

相邻的两个数之间若前一个数>后一个数,他俩就交换。

第一次交换结果:2 4 32 6 45 1 33 334

第一次交换,最大的一个数就确定了,下次遍历次数就-1。

第二次交换结果:2 4 6 32 1 33 45 334

第二次交换,第二大的数也确定了,下次遍历次数就-2。

以此类推,得出结果:1 2 4 6 32 33 45 334

#include<iostream>
using namespace std;
void Bubblesort(int a[], int len)
{
	if (a == NULL || len <= 0)return;
	for (int j = 0; j < len-1; j++) {
		for (int i = 0; i + 1 < len-j; i++)
		{
			if (a[i] > a[i + 1])
				swap(a[i], a[i + 1]);
		}
		for (int i = 0; i < len; i++)
			cout << a[i] << " ";
		cout<<endl;
	}
}
int main()
{
	int arr[] = { 2,32,4,45,6,334,1,33 };
	Bubblesort(arr, sizeof(arr) / sizeof(arr[0]));
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
		cout << arr[i] << " ";
	return 0;
}

优化:

我们定义一个标记flag,表示最后一次交换的位置,更新i,内层循环需要交换的位置就是0~len-flag-2,外层循环遍历次数也变为flag-1次。

#include<iostream>
using namespace std;
void BubbleSort(int len, int a[])
{
	int flag;
	for (int i = 0; i < len - 1; i++)
	{
		//最后一次交换的位置
		flag = 0;
		for (int j = 0; j < len - i - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
				swap(a[j], a[j + 1]);
				flag = j + 1;
			}
		}
		//没有发生交换
		if (flag == 0)break;
		//内层循环更新到上一次最后交换的位置
		i = len - flag - 1;
	}
}
int main()
{
	int a[] = { 5,4,3,2,1 };
	
      BubbleSort(sizeof(a) / sizeof(a[0]), a);
	  for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
		  	cout << a[i] << " ";
		  	cout << endl;
	return 0;
}

选择排序(Select Sort)

每次遍历找到最值(最大值或最小值)放入相应位置。

例如:2,32,4,45,6,334,1,33

找到最小值下标6,和第一个个值交换。

第一次遍历:1 32 4 45 6 334 2 33

第二次遍历从下标1开始找到最小的为下标6和第二个值交换。

第二次遍历:1 2 4 45 6 334 32 33

一此类推,得出结果:1 2 4 6 32 33 45 334

#include<iostream>
using namespace std;
void SelectSort(int len, int a[])
{
	if (a == NULL || len <= 0)return;
	int i;
	int j;
	int nMin;
	for (i = 0; i < len-1; i++)
	{
		nMin = i;
		for (j = i+1; j < len; j++)
		{
			if (a[j] < a[nMin])
				nMin = j;
		}
		if (nMin != i)swap(a[i],a[nMin]);
	}
}
int main()
{
	int a[] = { 2,32,4,45,6,334,1,33 };
	SelectSort(sizeof(a) / sizeof(a[0]), a);
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
		cout << a[i] << " ";
	return 0;
}

插入排序(InsertSort)

适用范围:(1)元素少。(2)每个元素在排序前的位置距其最终排好序的位置不远的时候。

将待排序数据分成两部分,一部分有序,一部分无序,将无序元素依次插入到有序中去,完成排序。

例如: 2,32,4,45,6,334,1,33 

首先有序部分是2,无序部分是32,4,45,6,334,1,33 

用i,j分别记录有序部分位置和无序部分位置。

需要插入n-1次,保存当前需要插入的无序元素。

然后倒序遍历有序元素,如果无序元素比有序元素大那就插入在这个有序元素的下一个位置,如果比它小,那就将有序元素向后移一位继续遍历。循环往复。

2,32,4,45,6,334,1,33 

2,4,32,45,6,334,1,33 

2,4,32,45,6,334,1,33 

2,4,6,32,45,334,1,33

2,4,6,32,45,334,1,33

1,2,4,6,32,45,334,33

1,2,4,6,32,33,45,334

#include<iostream>
using namespace std;
void InsertSort(int len, int a[])
{
	if (a == NULL || len <= 0)return;
	int i;
	int j;
	int temp;
	for (i = 1; i < len; i++)
	{
		j = i - 1;
		temp = a[i];
		while (j >= 0 && a[j] > temp)
		{
			a[j+1] = a[j];
			j--;
		}
		a[j + 1] = temp;
	}
}
int main()
{
	int a[] = { 2,32,4,45,6,334,1,33 };
	InsertSort(sizeof(a) / sizeof(a[0]), a);
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
		cout << a[i] << " ";
	return 0;
}

希尔排序(ShellSort)

将待排序数据分组,各组之内进行插入排序。(间隔分组 缩小增量)

(1)确定间隔

(2)分组(间隔是几就是分几组)

(3)各组插入排序

例:

按间隔分组后,23,45,43插入排序,1,2插入排序,73,6插入排序,11,8插入排序。

排完序后如下图,继续分组。

按间隔分组后,23,6,43,73,45插入排序,1,8,2,11插入排序。

最后每个元素在排序前的位置距其最终排好序的位置不远的时候也就是插入排序适用的条件。

排完后如下图,继续分组。

最后排完序

计数排序(CountSort)

元素分配密集,且重复出现频率较高,找到最值,统计计数器个数,对每个元素出现次数进行统计。

(1)找到最大值,最小值

(2)创建数组0~max-min

(3)计数

(4)排序:计数值非0,索引+最小值。

​
#include<iostream>
using namespace std;
void CountSort(int len, int a[])
{
	if (len <= 0 || a == NULL)return;
	int maxx=a[0];
	int minn=a[0];
	for (int i = 1; i < len; i++)
	{
		maxx = max(maxx, a[i]);
		minn = min(minn, a[i]);
	}
	int* Count = (int*)malloc(sizeof(int) * (maxx - minn + 1));
	memset(Count, 0, sizeof(int) * (maxx - minn + 1));
	for (int i = 0; i < len; i++)
	{
		Count[a[i] - minn]++;
	}
	int j = 0;
	for (int i = 0; i < maxx - minn + 1; i++)
	{
		
		while (Count[i] != 0)
		{
			a[j] = minn + i;
			Count[i]--;
			j++;
		}
	}
	free(Count);
	Count = NULL;
	for (int i = 0; i < len; i++)
		cout << a[i] << " ";
}
int main()
{
	int a[] = { 2,32,4,45,6,334,1,33 };
	CountSort(sizeof(a) / sizeof(a[0]), a);
	return 0;
}

​

优化:

从计数数组的第二个元素开始,后面每一个都加上前面所有元素之和,数组大小代表了该数据在序列中的位置,所以从后往前输出。

#include<iostream>
using namespace std;
void CountSort(int len, int a[])
{
	if (len <= 0 || a == NULL)return;
	int maxx=a[0];
	int minn=a[0];
	for (int i = 1; i < len; i++)
	{
		maxx = max(maxx, a[i]);
		minn = min(minn, a[i]);
	}
	int* Count = (int*)malloc(sizeof(int) * (maxx - minn + 1));
	memset(Count, 0, sizeof(int) * (maxx - minn + 1));
	for (int i = 0; i < len; i++)
	{
		Count[a[i] - minn]++;
	}
	for (int i = 1; i < maxx - minn + 1; i++)
	{
		Count[i] += Count[i - 1];
	}
	int* arr = (int*)malloc(len * sizeof(int));
	for (int i = len - 1; i >=0; i--)
	{
		arr[Count[a[i] - minn] - 1] = a[i];
		Count[a[i] - minn]--;
	}
	
	for (int i = 0; i < len; i++)
		cout << arr[i] << " ";
	free(Count);
	Count = NULL;
	free(arr);
	arr = NULL;
}
int main()
{
	int a[] = { 2,2,2,77,77,3,3,4,66,6,4,3,2,1 };
	CountSort(sizeof(a) / sizeof(a[0]), a);
	return 0;
}

快速排序(QuickSort)

首先选出标准值,然后(挖坑填补法)从右到左找小于标准值的,放入左侧坑,然后从左到右找大于标准值的放入右侧坑循环,然后两个指向位置相遇了就放入标准值,然后继续找,左:(起始位置,标准值-1),右(标准值+1,结束位置)。

例如:

将左侧9作为标准值,从右向左找小于9的,找到6。

然后将6放入左坑,现在从左往右找比9大的放右坑。

找到45放到右坑,然后再从右向左找小于9的放左坑,找到3。

然后再从左往右找比9大的,发现没有了,标记相遇了。

放入标准值9。

然后在(起始位置,标记值-1) , (标记值+1,结束位置)重复以上过程直到蓝色>=红色标记结束。

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
int part(int* a, int left, int right)
{
	int i = left, j = right,k = a[left]; 
	while (i < j)
	{
		while (i<j ) 
		{
			if (a[j] < k)
			{
				a[i] = a[j];
				i++;
				break;
			}
			j--;
		}
		while (i < j)
		{
			if (a[i] >k)
			{
				a[j] = a[i];
				j--;
				break;
			}
			i++;
		}
	}
	a[i] = k;
	return i;  
}
void Quicksort(int* a, int left, int right)
{
	if (a == NULL || left >= right)return;
	int mid;
		mid = part(a, left, right); 
		Quicksort(a, left, mid - 1);
		Quicksort(a, mid + 1, right); 
}
int main()
{
	int a[] = { 9,1,2,45,7,3,6,22,11 };
	int len = sizeof(a) / sizeof(a[0]);
	Quicksort(a, 0, len-1);
	for (int i = 0; i < len; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

优化:

选择最右侧的值作为基准元素,在代码中,基准元素前期不需要移动,只需在最后移动就行。

定义nsmall为最后一个小于基准元素的位置。

(1)做标记nsmall。

(2)遍历:从左到右遍历,当前值小于基准值,++nsmall和left是否相等,不相等交换。

(3)标准值放入。

(4)左半部分。

(5)右半部分。

#include <iostream>
using namespace std;
int part(int* a, int left, int right) {
    int nsmall = left - 1;
    for (left; left < right; left++)
    {
        if (a[left] < a[right])
        {
            if (++nsmall != left)
            {
                swap(a[nsmall], a[left]);
            }
        }
    }
    if (++nsmall != right)
        swap(a[nsmall], a[right]);
    return nsmall;
}

void Quicksort(int* a, int left, int right) {
    if (a == NULL || left >= right)return;
        int mid = part(a, left, right); 
        Quicksort(a, left, mid - 1);    
        Quicksort(a, mid + 1, right);  
}

int main() {
    int a[] = { 1, 43, 4, 6, 21, 23, 77, 8, 5, 3 };
    int len = sizeof(a) / sizeof(a[0]);
    Quicksort(a, 0, len - 1);
    for (int i = 0; i < len; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}

其它优化:

(1)基准值选取:三选一(起始,中间,结束位置选取中数),九选一

(2)基准值聚集(数据重复,基准值选完有重复的把他们聚集)

(3)分割至元素较少(<16)然后插入排序

(4)循环+申请空间(递归要是内存不够会出现异常)

归并排序(Merge Sort)

将多个有序数组进行合并。

例如:

先分成两部分,然后继续往下分。(这里是将两个有序数组合并,多个也一样)

然后从下往上合并,33比12小,所以12,33,2比4小,2,4,然后继续往上合并,2比12小放12前面,4比12小放12前面后面元素都一起拿过来,2,4,12,33,然后其余同理。

步骤:

(1)找中间位置。

(2)分成两部分:左(起始位置,中间位置)右(中间位置+1,结束位置)

(3)合并。

#include<iostream>
using namespace std;
void Merge(int a[], int begin, int end)
{
	int begin1 = begin;
	int end1 = begin + (end - begin) / 2;
	int begin2 = end1 + 1;
	int end2 = end;
	int* ptemp = (int*)malloc(sizeof(int)*(end-begin+1));
	int i=0;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin2] < a[begin1])
		{
			ptemp[i++] = a[begin2++];
		}
		else {
			ptemp[i++] = a[begin1++];
		}
	}
	while (begin1 <= end1)
	{
		ptemp[i++] = a[begin1++];
	}
	while (begin2 <= end2)
	{
		ptemp[i++] = a[begin2++];
	}
	for (int j = 0; j < end - begin + 1; j++)
	{
		a[begin + j] = ptemp[j];
	}
	free(ptemp);
	ptemp = NULL;
}
void MergeSort(int a[], int begin, int end)
{
	if (a == NULL || begin >= end)return;
	int Mid = begin + (end - begin) / 2;
	MergeSort(a, begin, Mid);
	MergeSort(a, Mid + 1, end);
	Merge(a, begin, end);
}
int main()
{
	int a[] = { 12,33,2,4,8,63,12 };
	int len = sizeof(a) / sizeof(a[0]);
	MergeSort(a, 0, len - 1);
	for (int i = 0; i < len; i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}

堆排序(Heap Sort)

每次找最值,将最值放在相应位置上。

堆:大根堆(大堆),小根堆(小堆)。

(我们这里按大根堆来)首先创建初始堆。

例:

首先我们创建一颗完全二叉树,然后进行调整,父亲节点要比孩子节点大(父亲节点0~n/2-1)

3比1大调整

16比7大调整

12比9大不用调整

16比6大调整

6比8小调整

得到初始堆:16,12,8,3,9,7,6,1

然后开始排序,顶末交换,也就是第一个和最后一个交换

1,16交换变为:1,12,8,3,9,7,6,16

16排好了我们就不看16了,然后我们调整堆顶。

调整完为12,9,8,3,1,7,6,16

然后继续交换调整,重复上面步骤,直到剩一个。

9,6,8,3,1,7,12,16

8,6,7,3,1,9,12,16

7,6,1,3,8,9,12,16。

6,3,1,7,8,9,12,16。

3,1,6,7,8,9,12,16。

结果:1,3,6,7,8,9,12,16。

步骤:

(1)创建初始堆:依次调整各个父亲节点。

(2)顶末交换,调整堆顶,直到只剩下1一个元素。

调整函数:先看孩子个数,然后找孩子里的最大值,最大值比父亲小结束,比父亲大交换。

#include<iostream>
using namespace std;
#define LEFT SwapId*2+1
#define RIGHT SwapId*2+2
void Adjust(int a[], int len, int SwapId)
{
	int maxx;
	//因为LEFT一定有
	for (maxx = LEFT; maxx < len; maxx = LEFT)
	{
		if (RIGHT < len)
		{
			if (a[RIGHT] > a[maxx])
			{
				maxx = RIGHT;
			}
		}
		if (a[maxx] > a[SwapId])
		{
			swap(a[maxx], a[SwapId]);
			SwapId = maxx;
		}
		else {
			break;
		}
	}
}
void HeapSort(int a[], int len)
{
	if (a == NULL || len <= 0)return;
	for (int i = len/2 - 1; i >= 0; i--)
	{
		Adjust(a, len, i);
	}
	for (int i = len - 1; i > 0; i--)
	{
		swap(a[0], a[i]);
		Adjust(a, i, 0);
	}
}
int main()
{
	int a[] = { 12,33,2,4,8,63,23,69,1,12 };
	int len = sizeof(a) / sizeof(a[0]);
	HeapSort(a, len);
	for (int i = 0; i < len; i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}

桶排序(Bucket Sort)

原始:为小数服务的[0,1)相同位数的小数。

延申:整数。

桶与桶之间相互有序。

(1)桶,各桶范围。

(2)各桶内排序(Bubble Sort)。

(3)放回后依次遍历各条链表(哈希)。

(4)释放(先链表,后表头)。

基数排序(Radix Sort)

(LSD从低位优先,MSD高位优先。一般用LSD)

例:

(1)先找最大值。

(2)计算最大值位数。

(3)按位处理:申请组,拆位将数据入组(尾插),表内元素放回原数组,释放。

总结

稳定:排序前后相对位置未发生改变,保证多次排序结果相同,最稳定的就是基数排序,其余的(判断条件>=可能就不稳定了)

名称最优时间复杂度平均时间复杂度最坏时间复杂度空间复杂度稳定性
冒泡排序O(n)O(n^{2})O(n^{2})O(1)稳定
选择排序------O(n^{2})------O(1)不稳定
插入排序O(n)O(n^{2})O(n^{2})O(1)稳定
希尔排序--------------------O(1)不稳定
快速排序O(nlog2^{n})O(nlog2^{n})O(n^{2})O(log2^{n})不稳定
归并排序O(nlog2^{n})O(nlog2^{n})O(nlog2^{n})O(n)稳定
堆排序O(nlog2^{n})O(nlog2^{n})O(nlog2^{n})O(1)不稳定
基数排序O(n*k)O(n*k)O(n*k)O(n+k)稳定

(注:k是最大值位数)

注:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【注册中心】ZooKeeper

文章目录 概述Zookeeper的应用场景Zookeeper的角色Zookeeper 的数据模型zookeeper客户端常用命令Zookeeper的核心功能Zookeeper的架构与集群规则Zookeeper的工作模式Zookeeper如何实现分布式锁Zookeeper JavaAPI&#xff08;Curator&#xff09;来源 概述 Zookeeper 是一个开源…

牛市股票还会亏钱?--外观模式

1.1 牛市股票还会亏钱&#xff1f; 炒股&#xff0c;碰到熊市&#xff0c;亏得一塌糊涂。 "我们公司的人现在都在炒股票&#xff0c;其实大部分人都不太懂&#xff0c;就是因为现在股市行情很火&#xff0c;于是都在跟风呢&#xff01;" 刚入市的人&#xff0c;什么都…

二分答案(砍树,借教室)

二分的两种情况附代码&#xff1a; 二分查找条件&#xff1a;单调&#xff0c;二段性 例题1&#xff1a;P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 上代码&#xff1a; #include<bits/stdc.h> using namespace std; const …

【51单片机入门记录】A/D D/A转换器概述

目录 一、A/D D/A转换器简介 &#xff08;1&#xff09;模数转换器-ADC &#xff08;analogue-to-digital conversion&#xff09; &#xff08;2&#xff09;数模转换器-DAC&#xff08;digital-to-analogue conversion&#xff09; &#xff08;3&#xff09;应用场景 二…

ruoyi-nbcio-plus基于vue3的flowable流程元素选择区面板的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Web Component 组件库有什么优势

前言 前端目前比较主流的框架有 react&#xff0c;vuejs&#xff0c;angular 等。 我们通常去搭建组件库的时候都是基于某一种框架去搭建&#xff0c;比如 ant-design 是基于 react 搭建的UI组件库&#xff0c;而 element-plus 则是基于 vuejs 搭建的组件库。 可能你有这种体…

R语言数据操纵:如何构建子集

目录 向量的子集 矩阵的子集 数据框的子集 列表的子集 如何处理缺失值 向量化操作 构建子集的基本方法&#xff1a; 1.使用[]提取一个或多个类型相同的元素 2.使用[[]]从列表或者数据框中提取元素 3.使用$按名字从列表或数据框中提取元素 向量的子集 比如有一个向量…

ssm基于面向对象的学生事务处理系统分析与设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生事务处理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

java算法day44 | 动态规划part06 ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论基础 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。 体现在代码中就是对背包的遍历顺序不同。01背包是逆序遍历背包&#xff0c;完全背包是顺序遍历背包。 518. 零钱兑换 II class Solution {public int change(int amount, int[] coin…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff0c;定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则&#xff0c;银…

Everything搭建http服务器

突然发现everything还可以搭建http服务器&#xff0c;给大家分享一下 打开everything&#xff0c;按图示填写或选择内容 在浏览器输入你的本地地址和端口 再输入刚才设置的账户密码&#xff0c;即可使用

产品推荐 | 中科亿海微推出亿迅®A8000金融FPGA加速卡

01、产品概述 亿迅A8000金融加速卡&#xff0c;是中科亿海微联合金融证券领域的战略合作伙伴北京睿智融科&#xff0c;将可编程逻辑芯片与金融行业深度结合&#xff0c;通过可编程逻辑芯片对交易行情加速解码&#xff0c;实现低至纳秒级的解码引擎&#xff0c;端到端的处理时延…

Integer.parseInt和Integer.valueOf区别

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Integer.parseInt多…

传输层 --- TCP (下篇)

目录 1. 超时重传 1.1. 数据段丢包 1.2. 接收方发送的ACK丢包 1.3. 超时重传的超时时间如何设置 2. 流量控制 3. 滑动窗口 3.1. 初步理解滑动窗口 3.2. 滑动窗口的完善理解 3.3. 关于快重传的补充 3.4. 快重传和超时重传的区别 4. 拥塞控制 4.1. 拥塞控制的宏观认识…

Mysql安装(命令方式安装)

下载mysql压缩包 Mysql可以使用界面安装&#xff0c;也可以使用命令的方式安装&#xff0c;今天我们使用命令的方式安装mysql。首先下载mysql压缩包&#xff08;下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/&#xff09;&#xff0c;解压到你想要安装的目录。 …

C++相关概念和易错语法(3)(类的声明和定义、空指针分析、this指针)

1.类的声明和定义 注意类的声明和定义分离的时候&#xff0c;在定义处要使用域作用限定符&#xff0c;否则函数声明链接时的定位不到函数的定义。 这些成员变量、函数的作用于这个类域&#xff0c;将功能集成在一起&#xff0c;这体现出封装的思想。 在区分类的定义和声明时&…

C# WPF编程-元素绑定

C# WPF编程-元素绑定 将元素绑定到一起绑定表达式绑定错误绑定模式代码创建绑定移除绑定使用代码检索绑定多绑定绑定更新绑定延时 绑定到非元素对象Source属性RelativeSource属性DataContent属性 数据绑定是一种关系&#xff0c;该关系告诉WPF从源对象提取一下信息&#xff0c;…

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言&#xff08;温故而知新&#xff…

什么是ICMP协议,如何防护ICMP攻击

一.什么是ICMP ICMP&#xff08;Internet Control Message Protocol&#xff09;是互联网控制报文协议&#xff0c;是TCP/IP协议族的一个子协议。它主要用于在IP网络中传递控制信息和错误消息&#xff0c;是IP协议的补充。ICMP协议是一种无连接协议&#xff0c;它不需要建立…

SambaNova 芯片:深入解析其架构和高性能秘诀

SambaNova——一家总部位于帕洛阿尔托的公司已经筹集了超过10亿美元的风险投资&#xff0c;不会直接向公司出售芯片。相反&#xff0c;它出售其定制技术堆栈的访问权限&#xff0c;该堆栈具有专门为运行最大的人工智能模型而设计的专有硬件和软件。 最近&#xff0c;SambaNova…