当前位置: 首页 > news >正文

数据结构之各大排序(C语言版)

我们这里话不多说,排序重要性大家都很清楚,所以我们直接开始。

我们就按照这张图来一一实现吧!

一.直接插入排序与希尔排序.

这个是我之前写过的内容了,大家可以通过链接去看看详细内容。

算法之插入排序及希尔排序(C语言版)-CSDN博客

这里就直接赋上代码了

//直接插入排序(升序)
void Insertsort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){if (tmp < arr[end]){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}
}
//希尔排序(升序)
void Shellsort(int* arr, int n)
{int gap = n;while (gap > 1){gap = gap / 2;//gap = gap / 3 + 1;//先一组组排好//for (int i = 0; i < gap; i++)//{//	for (int j = i; j < n - gap; j += gap)//	{//		int end = j;//		int tmp = arr[end + gap];//		while (end >= 0)//		{//			if (tmp < arr[end])//			{//				arr[end + gap] = arr[end];//				end-=gap;//			}//			else//			{//				break;//			}//		}//		arr[end + gap] = tmp;//	}//}//多组并排for (int i = 0; i < n - gap; i++){int end = i;int tmp = arr[end + gap];while (end >= 0){if (tmp < arr[end]){arr[end + gap] = arr[end];end-=gap;}else{break;}}arr[end + gap] = tmp;}}
}

我们还是分析下他们的时间复杂度吧!

插入排序是通过进行比较来插入的,最坏的情况就是都要比较,所以是O(N^2),最好情况就是本生就是顺序且有序的。

而希尔排序则不同,大家现在当下只需知道大概在O(1.3N)左右即可

直接插入排序的特性总结:
1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 稳定性:稳定
希尔排序的特性总结:
1. 希尔排序是对直接插入排序的优化。
2. gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的比。
3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些书中给出的希尔排序的时间复杂度都不固定,大家就记为 O(1.3N)
4. 稳定性:不稳定

二.选择排序

选择排序的思想就是:找到最值的两个数,分别放在首尾,然后再选择次一级的,知道排好。是不是非常简单,所以这里我们上代码:

//选择排序(升序)
void Swap(int* p, int* q)
{int* tmp = *p;*p = *q;*q = tmp;
}
void Selectsort(int* arr, int n)
{int begin = 0;int end = n - 1;while (begin < end){int min = begin;int max = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] < arr[min])min = i;if (arr[i] > arr[max])max = i;}Swap(&arr[begin], &arr[min]);//注意:这里一定要留意max的值是不是begin位置,如果是,前一个交换会影响到后一个,所以要找到正确的位置if (max == begin)max = min;Swap(&arr[end], &arr[max]);begin++;end--;}
}
直接选择排序的特性总结:
1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定

三.堆排序

这个之前也实现过了,可以看链接:

堆排序(C语言版)-CSDN博客

这里还是贴下代码:

void Adjustup(int* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void Adjustdown(int* arr,int parent, int n)
{int child = parent * 2 + 1;while (child < n){if (child + 1 < n && arr[child + 1] > arr[child]){child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
//堆排序
void Heapsort(int* arr, int n)
{//建大堆/*for (int i = 1; i < n; i++){Adjustup(arr, i);}*/for (int i = (n - 1 - 1) / 2; i >= 0; i--){Adjustdown(arr,i,n);}//堆删除int end = n - 1;while (end > 0){Swap(&arr[end], &arr[0]);Adjustdown(arr,0, end);end--;}
}
堆排序的特性总结:
1. 堆排序使用堆来选数,效率就高了很多。
2. 时间复杂度:O(N*logN)
3. 空间复杂度:O(1)
4. 稳定性:不稳定

四.冒泡排序和快速排序

这是一个可以说是最简单的排序了,实现的关键就是想好两层循环的条件就行了,我之前也实现过了,大家可以去之前我的文章看看,这里给大家一个链接吧!

冒泡排序即相关想法-CSDN博客

这里直接上代码了,学到这还不会冒泡,建议别在看这个文章了,需要去补就前面的了。

//冒泡排序(升序)
void Bubblesort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - i - 1; j++){if (arr[j] > arr[j + 1])Swap(&arr[j], &arr[j + 1]);}}
}

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

下面开始我们可以说是非常难的部分了----快速排序

快速排序是 Hoare 1962 年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

我们先直接学hoare版本吧!

注意:hoare的版本是将key取开头的元素

如果我们按照升序排列,我们要先走右边的,这样才能保证相遇的点其值一定比key点的小,原因如下:

相遇分为以下两种情况:

1.左边相遇右边,即右边停止后左边一直走,没有找到比key大的元素直到相遇,而相遇点是右边找小找到的,说明相遇点比key点小(升序)

2.右边相遇左边,即左边停止后右边一直走,没有找到比key小的元素直到相遇,而相遇点是左边找大找到的,说明相遇点比key点大。(降序)

下面我们实现吧!

//快速排序(升序)
void Swap(int* p, int* q)
{int* tmp = *p;*p = *q;*q = tmp;
}
void Quicksort(int* arr, int begin, int end)//注意end到底是啥?如果是元素个数,下面的right要减1,如果是最后一个元素下标,end=right
{//递归结束条件if (begin >= end)return;int left = begin;int right = end - 1;int key = begin;while (left < right){//先右while (left < right && arr[right] >= arr[key])//右找小{right--;}//再左while (left < right && arr[left] <= arr[key])//左找大{left++;}Swap(&arr[left], &arr[right]);}//相遇点和key交换Swap(&arr[left], &arr[key]);//第一次完成//下面是递归部分key = left;Quicksort(arr, 0, key);Quicksort(arr, key + 1,end);
}

这个就是hoare版本了,学到这你可能会问一下问题:

1.为什么左边要找大,右边要找小?

我们如果要排升序,是不是从小到大的顺序,如果交换的左右不是大和小,那么你确定是在排序

2.key为啥就是数组开头元素呢?

这个其实只是hoare版本的key找法,实际上还有其他方法的,下面我们就讲解下其他key找法。

//三数取中法
int Mid(int* arr,int begin, int end)
{int mid = (begin + end-1) / 2;if (arr[begin] > arr[end]){if (arr[mid] > arr[end]){if (arr[begin] > arr[mid])return mid;elsereturn begin;}return end;}else{if (arr[mid] > arr[begin]){if (arr[end] > arr[mid])return mid;elsereturn end;}return begin;}
}

对于上面的内容要注意我们都是end表示为最后一个元素是第几个元素,而非所在的数组下标。

下面我们将其改成数组下标,再写一遍hoare版本的快排。

//三数取中法
int Mid(int* arr,int begin, int end)
{int mid = (begin + end) / 2;if (arr[begin] > arr[end]){if (arr[mid] > arr[end]){if (arr[begin] > arr[mid])return mid;elsereturn begin;}return end;}else{if (arr[mid] > arr[begin]){if (arr[end] > arr[mid])return mid;elsereturn end;}return begin;}
}
void Quicksort(int* arr, int begin, int end)//end表示最后一个元素下标
{if (begin >= end)return;int left = begin;int right = end;int key = begin;while (left < right){while (left < right && arr[right] >= arr[key])right--;while (left < right && arr[left] <= arr[key])left++;Swap(&arr[left], &arr[right]);}Swap(&arr[left], &arr[key]);key = left;Quicksort(arr, 0, key - 1);Quicksort(arr, key + 1, end);
}

注意改变之处。

大家可能会发现hoare版本的快排有非常多的点需要注意,于是后人就写出了以下两种不同的写法,对其进行改进。

挖坑法

挖坑法是指先将一个数据储存在数组外面,然后还是右边找小,左边找大,找到就将该位置的数放在原先取出的位置,然后现在的位置即是一个新的坑,一直上述操作直到左右相遇,然后将最开始保存的数据放进相遇位置。

下面我们实现它:

//挖坑法
void partQuicksort(int* arr, int begin, int end)//end表示最后一个元素下标
{if (begin >= end)return;int left = begin;int right = end;int key = arr[begin];int hole = begin;//坑while (left < right){while (left < right && arr[right] >= key)right--;arr[hole] = arr[right];hole = right;while (left < right && arr[left] <= key)left++;arr[hole] = arr[left];hole = left;}arr[hole] = key;partQuicksort(arr, begin, hole - 1);partQuicksort(arr, hole + 1, end);
}
前后指针版本

//前后指针法
void part2Quicksort(int* arr, int begin, int end)//end表示下标
{if (begin >= end)return;int prev = begin;int cur = begin + 1;int key = begin;while (cur <= end){if (arr[cur] < arr[key] && ++prev != cur){Swap(&arr[prev], &arr[cur]);}cur++;}Swap(&arr[prev], &arr[key]);key = prev;part2Quicksort(arr, 0, key - 1);part2Quicksort(arr, key + 1, end);	
}

对于快排还可以优化,例如:我们这里实现时发现,大部分的递归都是在元素非常小的时候,所以如果我们可以将这部分改成其他排序,是不是可以节省一部分空间。

我们以hoare版本为例:

void Quicksort2(int* arr, int begin, int end)//end表示最后一个元素下标
{if (begin >= end)return;//如果元素小于等于10,利用其他排序,这里我们选择插入排序if (end - begin + 1 <= 10){Insertsort(arr+begin, end - begin + 1);//注意这里数组也要变}else{int left = begin;int right = end;int key = begin;while (left < right){while (left < right && arr[right] >= arr[key])right--;while (left < right && arr[left] <= arr[key])left++;Swap(&arr[left], &arr[right]);}Swap(&arr[left], &arr[key]);key = left;Quicksort(arr, 0, key - 1);Quicksort(arr, key + 1, end);}
}

快排学到现在了,大家是不是觉得自己行了???现在我请你实现快排的非递归,请问你如何实现呢?

//快排非递归
int Quicksort3(int* arr, int begin, int end)
{//我们这里就用挖坑法实现int hole = begin;int key = arr[begin];while (begin < end){while (begin < end && arr[end] >= key)end--;arr[hole] = arr[end];hole = end;while (begin < end && arr[begin] <= key)begin++;arr[hole] = arr[begin];hole = begin;}arr[hole] = key;return hole;
}
void QuicksortNone(int* arr, int begin, int end)
{SS s1;StackInit(&s1);StackPush(&s1,begin);StackPush(&s1, end);while (!StackEmpty(&s1)){int right = StackTop(&s1);StackPop(&s1);int left = StackTop(&s1);StackPop(&s1);int key = Quicksort3(arr, left, right);if (left < key - 1){StackPush(&s1, left);StackPush(&s1,key-1);}if (right > key + 1){StackPush(&s1,key+1);StackPush(&s1,right);}}StackDestory(&s1);
}

快速排序的特性总结:
1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
2. 时间复杂度:O(N*logN)
3. 空间复杂度:O(logN)
4. 稳定性:不稳定

五.归并排序

基本思想:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
//归并排序
void _Mergesort(int* arr, int begin, int end, int* tmp)
{if (begin >= end)return;//先递归int mid = (begin + end) / 2;_Mergesort(arr, begin, mid, tmp);_Mergesort(arr, mid + 1, end,tmp);//并int begin1 = begin;int end1 = mid;int begin2 = mid + 1;int end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){tmp[i++] = arr[begin1++];}else{tmp[i++] = arr[begin2++];}}while (begin1 <= end1){tmp[i++] = arr[begin1++];}while (begin2 <= end2){tmp[i++] = arr[begin2++];}memcpy(arr + begin, tmp + begin, (end - begin + 1)*sizeof(int));
}
void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);//检查if (tmp == NULL){perror(tmp);return;}_Mergesort(arr, 0, n-1, tmp);free(tmp);tmp = NULL;
}

当然,归并排序也可以非递归实现,由于实现过于复杂,所以我们现在就先不是实现了,以后我们会讲的。

大家加油!

相关文章:

数据结构之各大排序(C语言版)

我们这里话不多说&#xff0c;排序重要性大家都很清楚&#xff0c;所以我们直接开始。 我们就按照这张图来一一实现吧&#xff01; 一.直接插入排序与希尔排序. 这个是我之前写过的内容了&#xff0c;大家可以通过链接去看看详细内容。 算法之插入排序及希尔排序&#xff08…...

c++ 中多线程的使用

如果你的其他逻辑必须在线程 t1 和 t2 之后执行&#xff0c;但你又希望这些线程能够同时运行&#xff0c;你可以在主线程中使用 std::thread::detach 将线程分离&#xff0c;让它们在后台运行。这样&#xff0c;主线程不会等待这些线程的完成&#xff0c;而可以继续执行其他逻辑…...

理解二叉树的遍历(算法村第七关白银挑战)

二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]解 LeetCode以及面试中提供的方法可能…...

所有单片机使用的汇编语言是统一的吗?

所有单片机使用的汇编语言是统一的吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&…...

C ++类

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…...

STM32疑难杂症

1.keil的奇怪问题 创建的数组分配内存到0x10000000地址的时候&#xff0c;数据总是莫名其妙的出现问题&#xff0c;取消勾选就正常了 stm32f407内部有一个CCM内存&#xff0c;这部分内存只能由内核控制&#xff0c;任何外设都不能够进行访问。这样问题就来了&#xff0c;如果使…...

GIT使用简介

Git 是一种版本控制系统&#xff0c;常用于团队协作开发和管理代码。下面是 Git 的基本使用方式&#xff1a; 安装 Git&#xff1a;首先&#xff0c;在你的计算机上安装 Git。你可以从 Git 官方网站&#xff08;https://git-scm.com/&#xff09;下载适合你操作系统的版本&…...

easycode 插件配置文件

easycode是一个idea生成文件的插件&#xff0c;以下是我的一个项目中配置信息&#xff0c;需要的可以拿走&#xff0c;保存成json文件导入即可 {"author" : "XXX","version" : "1.2.8","userSecure" : "","…...

elasticsearch系列四:集群常规运维

概述 在使用es中如果遇到了集群不可写入或者部分索引状态unassigned&#xff0c;明明写入了很多数据但是查不到等等系列问题该怎么办呢&#xff1f;咱们今天一起看下常用运维命令。 案例 起初我们es性能还跟得上&#xff0c;随着业务发展壮大&#xff0c;发现查询性能越来越不…...

6.6 会话与输入事件(三)

三,Pointer会话 3.1 Pointer会话及其属性 指针输入会话使用SCREEN_EVENT_POINTER类型创建,通常用于控制光标的形状和位置。 指针会话的SCREEN_PROPERTY_MODE属性未使用。但是,可以使用下面的会话属性配置指针会话: SCREEN_PROPERTY_ACCELERATION表示一组六个整数,表示x…...

【自动化测试总结】优点、场景、流程、项目人员构成

一、自动化测试的概念 以程序测试程序&#xff0c;以代码代替思维&#xff0c;以脚本的运行代替手工测试&#xff0c;可以大大提高工作测试的效率。 二、自动化测试的优点 1.回归测试更为方便&#xff0c;可靠。自动化测试最主要的任务和特点&#xff0c;特别是在程序修改比较…...

杨中科 ASP.NETCore Rest

什么是Rest RPC 1、Web API两种风格: 面向过程(RPC) 、面向REST (REST) 2、RPC:“控制器/操作方法“的形式把服务器端的代码当成方法去调用。把HTTP当成传输数据的通道&#xff0c;不关心HTTP谓词。通过QueryString请求报文体给服务器传递数据。状态码。比如/Persons/GetAll…...

RTU数据采集终端

在现代工业控制系统中&#xff0c;数据采集是一个至关重要的步骤。RTU(远程终端单元)作为一种常用的数据采集终端设备&#xff0c;不仅可以实现数据的采集和传输&#xff0c;还可以实现现场设备的远程监控和控制。 一、RTU数据采集终端的工作原理 RTU数据采集终端是一种将现场…...

双指针--- 数组元素的目标和

目录 数组元素的目标和思路&#xff1a;暴力做法思路&#xff1a;双指针做法&#xff1a; 代码: 原题链接 数组元素的目标和 给定两个升序排序的有序数组 A 和 B &#xff0c;以及一个目标值 x 。 数组下标从 0 开始。 请你求出满足 A[i]B[j]x 的数对 (i,j) 。 数据保证有唯…...

你的网站或许不需要前端构建(二)

前一阵&#xff0c;有朋友问我&#xff0c;能否在不进行前端编译构建的情况下&#xff0c;用现代语法开发网站界面。 于是&#xff0c;就有了这篇文章中提到的方案。 写在前面 这篇文章&#xff0c;依旧不想讨论构建或不构建&#xff0c;哪一种方案对开发更友好&#xff0c;…...

flutter 使用adb 同时连接 多个模拟器

MUMU模拟器 MuMu模拟器官网_安卓12模拟器_网易手游模拟器 传统只需要 连接一个 默认命令是 默认端口是7555 adb connect 127.0.0.1:7555 但是需要同时连接调试多个模拟器的时候 就需要连接多个 这里可以使用自带的多开 多开后 使用 1 是对应多开的序号 这样就可以查看对…...

网络四元组

文章目录 网络四元组 今天我们来聊聊 网络四元组 网络四元组 四元组&#xff0c;简单理解就是在 TCP 协议中&#xff0c;去确定一个客户端连接的组成要素&#xff0c;它包括源 IP 地址、目标 IP 地址、源端口号、目标端口号。 正常情况下&#xff0c;我们对于网络通信的认识可…...

[实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击

思路 1、优化正则表达式 2、正则表达式无法优化的话&#xff0c;可以考虑限制匹配次数&#xff0c;或者限制匹配时间 限制 匹配次数 public class CountedCharSequence implements CharSequence {private final CharSequence charSequence;private long count;public Counte…...

ffmpeg 5.0版本调试 ffmpeg 5.01 static版本

ffmpeg 5.0版本调试 写法&#xff1a;ffmpeg -rtsp_transport tcp -re -i rtsp://admin:BYTtest2019192.168.1.2:554/h264/ch1/main/av_stream -q 5 -f mpegts -fflags nobuffer -c:v mpeg1video -an -s 960x540 http://127.0.0.1:12345/demo本地写法 ffmpeg -timeout 5000000…...

应用在游戏机触摸屏中的触摸感应芯片

触屏游戏机的屏幕是由液晶屏和触控层组成的。触控层分为电容式触屏和电阻式触屏两种。电容式触屏是将悬空电极和屏幕玻璃上的电极组成静电场,当人体接近屏幕时,就会改变静电场分布,从而实现触摸的位置探测。而电阻式触屏则是利用玻璃上的两层电极之间通电形成一个电阻值,当手指…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...