【C语言】qsort()函数详解:能给万物排序的神奇函数

🦄个人主页:修修修也

🎏所属专栏:C语言

⚙️操作环境:Visual Studio 2022

 


目录

一.qsort()函数的基本信息及功能

二.常见的排序算法及冒泡排序

三.逐一解读qsort()函数的参数及其原理

1.void* base

2.size_t num

3.size_t size

4.int (*compar)(const void*,const void*)

四.使用qsort()函数完成整形,结构体的排序(演示)

1.使用qsort()函数完成对一维整形数组的排序:

2.使用qsort()函数完成对结构体的排序:

1>.使用qsort()函数完成对结构体按年龄排序

2>.使用qsort()函数完成对结构体按姓名排序

 五.套用冒泡算法,改造并模拟实现qsort()函数

1.bubble_sort()函数定义及参数

2.bubble_sort()函数函数体:

3.bubble_sort()函数中的回调函数Swap():

六.使用bubble_sort()函数完成整形,结构体的排序(演示)

1.使用bubble_sort()函数完成对一维整形数组的排序:

2.使用bubble_sort()函数完成对结构体的排序:

1>.使用bubble_sort()函数完成对结构体按年龄排序

 2>.使用bubble_sort()函数完成对结构体按姓名排序


一.qsort()函数的基本信息及功能

我们日常生活中经常能碰到需要给一组数据排序的情况,如将班上同学的身高从大到小排序,将淘宝上的商品价格从低到高排序,将班上的同学姓名按首字母顺序排序......随着科学技术的发展,现在这些工作完全可以交给excel一键完成,那么电脑是根据什么程序完成这些排序的?

接下来我们就来给大家介绍一下C语言库函数可以“给万物排序”qsort()函数

先来看一下qsort()函数(quick sort)在百度百科中的定义

因此,qsort()函数是一个C语言编译器函数库自带的排序函数,它可以对指定数组(包括字符串,二维数组,结构体等)进行排序


二.常见的排序算法及冒泡排序

我们熟知的数组排序的算法有很多,如冒泡排序,选择排序,直插排序,希尔排序,并归排序,快速排序等,具体八大算法的实现可以移步这篇博客【数据结构】八大排序算法

了解了这些种类繁多的排序算法后,我们希望能够使用一种较为简单的排序算法来实现qsort函数的功能,来模拟实现同样具有可以排序数组,字符串,结构体功能的排序函数。如,我们可以使用冒泡排序的算法来实现具有排序字符串,二维数组,结构体等功能bubble_sort()函数

如果还有不太熟悉冒泡排序的朋友可以移步这篇博客【C语言】冒泡排序详解,里面有关于冒泡算法完全0基础的详解,这里就不多赘述了,我们在这里直接演示一下冒泡排序的用法

冒泡排序算法演示(以升序为例):

数组元素初始顺序如下:

int arr[10] = { 3,1,5,9,7,6,4,8,0,2 };

冒泡排序(升序)运行结果

 冒泡排序(升序)完整代码如下:

//冒泡排序<升序>
#include<stdio.h>
void print(int arr[])
{int i = 0;for (i = 0; i <= 9; i++){printf("%d ", arr[i]);}printf("\n");
}void sort(int arr[],int sz)
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for(j=0;j<sz-1-i;j++){	if (arr[j] > arr[j + 1]){int emp =arr[j];arr[j] = arr[j + 1];arr[j + 1] = emp;}}}
}int main()
{int arr[10] = { 3,1,5,9,7,6,4,8,0,2 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr);sort(arr,sz);print(arr);return 0;
}

三.逐一解读qsort()函数的参数及其原理

在搞清了我们的排序算法后,接下来为了进一步模仿实现qsort()函数,我们需要逐一解读qsort()函数的参数及其作用,以便后续模仿实现它。

从cplusplus官网(cplusplus(C语言函数查询网站))上我们可以看到qsort()函数有四个参数的,如图:

 而cplusplus官网对这四个变量的解释是:


接下来我们一起来分析一下这四个参数及其作用

1.void* base

void* base

即,qsort()函数需要的第一个参数是待排序数组的首元素地址,而void*的意思是它是一个无类型指针,而无类型的原因是我们希望它是一个可以排序很多种类数据的排序函数,如果这里的指针类型固定,我们就只能对函数传入固定类型的参数进行排序了。

因此,要让qsort()函数帮助我们排序,首先要告诉它这组数据的首地址在哪。


2.size_t num

size_t num

这个参数代表待排数组的元素个数。且因为元素个数恒为非负数,因此该参数的数据类型size_t(即无符号整形)。

计算数组元素个数常用的是sizeof,即数组元素个数=数组总长度/数组首元素长度,如:

size_t num=sizeof(arr)/sizeof(arr[0]);

因此,要让qsort()函数帮助我们排序,我们还要告诉它这个数组一共有多少个元素


3.size_t size

size_t size

 该参数意为待排数组中每个元素的长度。同样因为元素长度恒为非负数,因此参数的数据类型是size_t(无符号整形)。

计算数组元素长度常用sizeof,及数组每个元素长度=数组首元素的长度,如:

size_t size=sizeof(arr[0]);

因此,要让qsort()函数帮助我们排序,我们还要告诉它这个数组中的每个元素的长度(即首元素的长度)。


4.int (*compar)(const void*,const void*)

 int (*compar)(const void*,const void*)

这个应该算最难理解的部分了,不过我们一点一点来看,还是先画个图帮助大家理解吧:

 经过我们的分析可知,该参数是一个函数指针,该指针指向的函数需要两个无类型的指针作为参数,同时该函数的返回值是一个int类型的整形

他的作用是将传进来的两个参数进行比较,如果参数p1<参数p2,则返回一个小于0的数,如果参数p1=参数p2,则返回0;如果参数p1>p2,则返回一个大于0的数

注意!compar()函数的作用仅仅是比较两个参数的大小,并通过返回值的形式告诉qsort()函数比较的结果,在运行期间是不能更改参数1或参数2的值的,所以为保险起见,我们可以给两个参数前加上const修饰,来使参数指向的数值无法改变

小tips:const修饰的指针在*符号左边即为固定指向的值不可改变在*符号右边则为固定指针指向的方向不可改变。可以简记为:左定值,右定向

compar()函数编写样例如下:

需要注意的是:这个指针指向的函数是由你自己编写的,即qsort()函数在其内部调用你编写的比较函数,而这个比较函数如何比较qsort()函数传递的两个参数完全由你自己定义的。

在qsort()函数调用完compar()函数后,会接收到compar()返回的一个有符号的整型数字,当接收到comper()返回大于0的数字时,qsort()函数就会将这两个元素做交换。而如果接收到comper()函数返回小于等于0的数时,qsort()函数不对其进行交换

因此,在compar()函数使用*p1-*p2的方式直接返回结果数字时,qsort()排出的序默认会是升序。而如果你希望qsort()函数排出一个降序数组时,那么就需要调换一下*p1和*p2的减法关系,直接返回*p2-*p1的值即可。


下面列举一些大家常用的compar()比较函数

1.对一维数组进行排序

int comper(const void*a,const void*b)
{return *(int*)a-*(int*)b;
}

2.对二维数组进行排序

int comper(const void*a,const void*b)
{return((int*)a)[0]-((int*)b)[0];
}

        应评论区的争议,测试二维数组函数的排序,测试代码如下:

1.使用本文二维数组排序代码测试

//使用文中函数进行二维数组排序
int comper(const void* a, const void* b)
{return((int*)a)[0] - ((int*)b)[0];
}int main()
{int arr[3][3] = { 3,1,5,9,7,6,4,8,0};size_t num = sizeof(arr) / sizeof(arr[0][0]);size_t sz = sizeof(arr[0][0]);qsort(arr, num, sz, comper);int i,j;for (i = 0; i<3; i++){for (j = 0; j < 3; j++){printf("%d ", arr[i][j]);}}return 0;
}

测试结果如下图,可以正常完成对二维数组的排序:

2.使用评论区二维数组排序代码测试:

//使用评论区函数进行二维数组排序
int comper(const void* a, const void* b)
{return (*(int**)a)[0] - (*(int**)b)[0];
}int main()
{int arr[3][3] = { 3,1,5,9,7,6,4,8,0 };size_t num = sizeof(arr) / sizeof(arr[0][0]);size_t sz = sizeof(arr[0][0]);qsort(arr, num, sz, comper);int i, j;for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){printf("%d ", arr[i][j]);}}return 0;
}

测试结果如下,完全不能运行:

3.对字符串进行排序

int comper(const void*p1,const void*p2)
{return strcmp((char*)p2,(char*)p1);
}

4.按结构体中某个关键字排序(对结构体一级排序):

structNode
{double data;int other;
}s[100];int comper(constvoid*p1,constvoid*p2)
{return(*(Node*)p2).data>(*(Node*)p1).data?1:-1;
}

5.对结构体中字符串进行排序:

struct Node
{int data;char str[100];
}s[100];
//按照结构体中字符串str的字典序排序
int comper(const void*p1,const void*p2)
{return strcmp((*(Node*)p1).str,(*(Node*)p2).str);
}

四.使用qsort()函数完成整形,结构体的排序(演示)

了解了qsort()函数的参数及其原理后,我们来尝试使用它完成一些排序任务,以此来熟悉qsort()函数的使用方法。

1.使用qsort()函数完成对一维整形数组的排序:

要使用qsort()函数,就要先准备好需要的四个参数,即数组的首地址数组的长度数组每个元素的长度,还有比较函数的地址(即函数名)。我们依次准备好这四个参数:

 接下来就可以调用qsort()函数查看结果了:

 可以看到,qsort()函数成功帮我们将该组整形排列成了升序。该部分完整代码如下

//使用qsort()函数排序一维数组
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>int compar(const void* p1, const void* p2)
{return ((*(int*)p1) - (*(int*)p2));
}int main()
{int arr[10] = { 3,1,5,9,7,6,4,8,0,2 };size_t num = sizeof(arr) / sizeof(arr[0]);size_t sz = sizeof(arr[0]);qsort(arr, num, sz, compar);int i=0;for (i = 0; i < num; i++)printf("%d ", arr[i]);return 0;
}

2.使用qsort()函数完成对结构体的排序:

要使用qsort()函数排序结构体,我们首先要创建一个结构体变量,如下,我们先创建一个包含人名和年龄结构体变量

 下面会以这个结构体变量为例,分别实现使用qsort()函数完成对结构体按年龄按姓名的排序。

1>.使用qsort()函数完成对结构体按年龄排序

我们照例先准备好它需要的四个参数,即结构体的首地址,结构体的长度,结构体每个元素的长度,还有比较函数的地址。我们依次准备好这四个参数:

 接下来就可以调用qsort()函数查看结果了:

 可以看到,qsort()函数帮助我们将该结构体成功按年龄从小到大重新排序了。该部分完整代码如下:

//使用qsort()函数按年龄排序结构体
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//创建结构体
struct Stu
{char name[20];int age;
};
//compar_按年龄排序
int compar_Stu_age(const void* p1, const void* p2)
{return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}int main()
{struct Stu s[3] = { {"zhangsan",20} ,{"lisi",30},{"wangmazi",25} };size_t num = sizeof(s) / sizeof(s[0]);size_t sz = sizeof(s[0]);qsort(s, num, sz, compar_Stu_age);for (int i = 0; i < 3; i++){printf("%s,%d\n", s[i].name, s[i].age);}return 0;
}

2>.使用qsort()函数完成对结构体按姓名排序

我们照例先准备好它需要的四个参数,即结构体的首地址,结构体的长度,结构体每个元素的长度,还有比较函数的地址。我们依次准备好这四个参数:

需要特别注意按姓名排序的排序函数,因为按姓名排序本质上是给字符串排序,所以我们借助strcmp()函数来比较两个字符串的大小,并将比较的结果返回给qsort()函数

有关strcmp()函数相关信息如下:

 接下来就可以调用qsort()函数查看结果了:

 可以看到,qsort()函数按照名字顺序(字典序)帮助我们成功排好了结构体的顺序,该部分完整代码如下

//使用qsort()函数按姓名排序结构体
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//创建结构体
struct Stu
{char name[20];int age;
};//compar_按姓名排序
int compar_Stu_name(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}int main()
{struct Stu s[3] = { {"zhangsan",20} ,{"lisi",30},{"wangmazi",25} };size_t num = sizeof(s) / sizeof(s[0]);size_t sz = sizeof(s[0]);qsort(s, num, sz, compar_Stu_name);//打印结果for (int i = 0; i < 3; i++){printf("%s,%d\n", s[i].name, s[i].age);}return 0;
}

 五.套用冒泡排序算法,改造并模拟实现qsort()函数

通过上面的例子,我们已经能够熟练使用并足够了解qsort()函数了,接下来我们就可以尝试套用冒泡算法来试试实现bubble_sort()函数了:

1.bubble_sort()函数定义及参数

函数参数没什么好说的,因为要模拟实现qsort()函数,因此直接仿照qsort()函数的参数即可:

void bubble_sort(void*base, size_t num,size_t sz,int(*compar)(const void*,const void*))

2.bubble_sort()函数函数体

函数体内部逻辑整体参考冒泡排序,只在一小部分地方有略微的改动。首先因为我们在整个bubble_sort()函数中都不知道base传进的参数到底是什么类型的,因此索性不去纠结数据的类型,干脆将他们统一视为一个字节一个字节的空间来进行比较及交换,因此传入bubble_sort()函数的指针统一强制类型转换成char*类型以便后续我们一个字节一个字节操作。该部分代码及解析如下:

{size_t i = 0;for (i = 0; i < num - 1; i++){size_t j = 0;for (j = 0; j < num - 1 - i; j++){if (compar((char*)base+j*sz,(char*)base+(j+1)*sz) > 0)//因为无法确定base到底代表什么类型的指针,因此不如全部当作字符(只占1字节)指针来处理{//交换Swap((char*)base + j * sz, (char*)base + (j + 1) * sz, sz);//交换思路同样是一个字节一个字节交换}}}
}

3.bubble_sort()函数中的回调函数Swap()

我们把原本冒泡排序中的交换步骤直接重新分装成一个函数,专门用来交换比较后需要交换的两个元素,同样因为我们并不知道该数据的类型只知道该数据的大小sz,因此我们不如直接将两个sz大小的字节内容逐个一个字节一个字节逐一交换,这样就能保证不论是什么类型的数据,交换完都不会出现差错了。该部分代码如下:

//交换函数
void Swap(char* buf1, char* buf2,int sz)
{int i = 0;for (i = 0; i < sz; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}

六.使用bubble_sort()函数完成整形,结构体的排序(演示)

完成了bubble_sort()函数的编写,接下来我们尝试使用它来代替前面的qsort()函数给数组及结构体进行排序:

1.使用bubble_sort()函数完成对一维整形数组的排序

我们像之前使用qsort()那样准备好bubble_sort()所需要的四个参数

接下来就可以使用bubble_sort()函数查看结果了:

 可以看到,bubble_sort()函数按照整形大小帮我们排好了升序。该部分完整代码如下:

//使用冒泡排序排列一维数组
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>void Swap(char* buf1, char* buf2,int sz)
{int i = 0;for (i = 0; i < sz; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bubble_sort(void*base, size_t num,size_t sz,int(*compar)(const void*,const void*))
{size_t i = 0;for (i = 0; i < num - 1; i++){size_t j = 0;for (j = 0; j < num - 1 - i; j++){if (compar((char*)base+j*sz,(char*)base+(j+1)*sz) > 0){Swap((char*)base + j * sz, (char*)base + (j + 1) * sz, sz);}}}
}int compar(const void* p1, const void* p2)
{return ((*(int*)p1) - (*(int*)p2));
}int main()
{int arr[10] = { 3,1,5,9,7,6,4,8,0,2 };size_t num = sizeof(arr) / sizeof(arr[0]);size_t sz = sizeof(arr[0]);bubble_sort(arr, num, sz, compar);int i = 0;for (i = 0; i < num; i++)printf("%d ", arr[i]);return 0;
}

2.使用bubble_sort()函数完成对结构体的排序

要使用bubble_sort()函数排序结构体,我们首先要创建一个结构体变量,如下,我们先创建一个包含人名和年龄的结构体变量

 下面会以这个结构体变量为例,分别实现使用bubble_sort()函数完成对结构体按年龄按姓名的排序。

1>.使用bubble_sort()函数完成对结构体按年龄排序

我们照例先准备好它需要的四个参数,即结构体的首地址结构体的长度结构体每个元素的长度,还有比较函数的地址。我们依次准备好这四个参数:

接下来就可以调用bubble_sort()函数查看结果了:

 可以看到,bubble_sort()函数帮助我们将该结构体成功按年龄从小到大重新排序了。该部分完整代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>//交换函数
void Swap(char* buf1, char* buf2, int sz)
{int i = 0;for (i = 0; i < sz; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bubble_sort(void* base, size_t num, size_t sz, int(*compar)(const void*, const void*))
{size_t i = 0;for (i = 0; i < num - 1; i++){size_t j = 0;for (j = 0; j < num - 1 - i; j++){if (compar((char*)base + j * sz, (char*)base + (j + 1) * sz) > 0){Swap((char*)base + j * sz, (char*)base + (j + 1) * sz, sz);}}}
}struct Stu
{char name[20];int age;
};//compar_按年龄排序
int compar_Stu_age(const void* p1, const void* p2)
{return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}int main()
{struct Stu s[3] = { {"zhangsan",20} ,{"lisi",30},{"wangmazi",25} };size_t num = sizeof(s) / sizeof(s[0]);size_t sz = sizeof(s[0]);bubble_sort(s, num, sz, compar_Stu_age);for (int i = 0; i < 3; i++){printf("%s,%d\n", s[i].name, s[i].age);}return 0;
}

 2>.使用bubble_sort()函数完成对结构体按姓名排序

我们照例先准备好它需要的四个参数,即结构体的首地址结构体的长度结构体每个元素的长度,还有比较函数的地址(即函数名)。我们依次准备好这四个参数:

 接下来就可以调用bubble_sort()函数查看结果了:

可以看到,bubble_sort()函数按照名字顺序(字典序)帮助我们成功排好了结构体的顺序,该部分完整代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//交换函数
void Swap(char* buf1, char* buf2, int sz)
{int i = 0;for (i = 0; i < sz; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bubble_sort(void* base, size_t num, size_t sz, int(*compar)(const void*, const void*))
{size_t i = 0;for (i = 0; i < num - 1; i++){size_t j = 0;for (j = 0; j < num - 1 - i; j++){if (compar((char*)base + j * sz, (char*)base + (j + 1) * sz) > 0){Swap((char*)base + j * sz, (char*)base + (j + 1) * sz, sz);}}}
}struct Stu
{char name[20];int age;
};//compar_按姓名排序
int compar_Stu_name(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}int main()
{struct Stu s[3] = { {"zhangsan",20} ,{"lisi",30},{"wangmazi",25} };size_t num = sizeof(s) / sizeof(s[0]);size_t sz = sizeof(s[0]);bubble_sort(s, num, sz, compar_Stu_name);for (int i = 0; i < 3; i++){printf("%s,%d\n", s[i].name, s[i].age);}return 0;
}

七.qsort()的核心:快速排序算法

快速排序的思想

快排算法的基本思想是:

  • 通过一趟排序将待排数据分割成独立的两部分
  • 其中一部分数据的关键字均比另一部分数据的关键字小
  • 可分别对这两部分数据继续进行排序,以达到整个序列有序的目的.

具体的快速排序算法是如何实现的,我放在另一篇博客中了,里面不仅有三种实现快排算法的方式,并且包含了如何使用非递归方式实现快排算法,这里有于篇幅有限,就不对赘述了,感兴趣的朋友可以移步这篇博客:

【数据结构】八大排序之快速排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135059337


总结

以上就是关于qsort()函数及其模拟实现bubble_sort()函数的全部内容,希望能对大家有所帮助或有所启发,欢迎各位大佬在评论区或私信与我交流.

有关更多排序相关知识可以移步:

【数据结构】八大排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】八大排序之堆排序算法

【数据结构】八大排序之简单选择排序

【数据结构】八大排序之直接插入排序算法

【数据结构】八大排序之希尔排序算法

【C语言】判断字符类型的三种方法

【C语言】rand()函数(如何生成指定范围随机数)

【C语言】memset()函数

【C语言】strlen()函数

【C语言】memcpy()函数



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

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

相关文章

节水增效,蜂窝物联智能灌溉助力农业升级!

智能灌溉的优势主要体现在以下几个方面&#xff1a; 1. 提高效率&#xff1a;智能灌溉可以根据作物生长的不同阶段和环境条件自动调整灌溉时间和水量&#xff0c;减少人工干预的频率和时间&#xff0c;提高了灌溉效率。 2. 节约水资源&#xff1a;智能灌溉可以根据土壤湿度和…

Python爬虫实战案例——王者荣耀皮肤抓取

大家好&#xff0c;我是你们的老朋友——南枫&#xff0c;今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩&#xff0c;直接上代码&#xff1a; 导入我们需要使用到的&#xff0c;也是唯一用到的库&#xff1a; 我们要抓取皮肤其…

大陆ARS548使用记录

一、Windows连接上位机 雷达是在深圳路达买的&#xff0c;商家给的资料中首先让配置网口&#xff0c;但我在使用过程中一直出现无法连接上位机的情况。接下来说说我的见解和理解。 1.1遇到的问题 按要求配置好端口后上位机无连接不到雷达&#xff0c;但wireshark可以正常抓到数…

PyPDF2拆分PDF文件的高级应用:指定拆分方式

本文目录 前言一、拆分方式选择1、代码讲解2、实现效果图3、完整代码前言 前两篇文章,分别讲解了将使用PyPDF2将PDF文档分割成为单个页面、在分割PDF文档时指定只分割出指定页面,如果你还没有看过,然后有需要的话,可以去看一下,我把文章链接贴到这里: PyPDF2拆分PDF文件…

Nuxt3 的生命周期和钩子函数(九)

title: Nuxt3 的生命周期和钩子函数&#xff08;九&#xff09; date: 2024/7/3 updated: 2024/7/3 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt3中与Vite相关的五个生命周期钩子&#xff0c;包括vite:extend、vite:extendConfig、vite:configResolved、vite…

CVE-2024-6387漏洞预警:尽快升级OpenSSH

OpenSSH维护者发布了安全更新&#xff0c;其中包含一个严重的安全漏洞&#xff0c;该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion&#xff0c;CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件&#xff08;也…

小型语言模型的兴起

过去几年&#xff0c;我们看到人工智能能力呈爆炸式增长&#xff0c;其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数&#xff0c;已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而&#xff0c;虽然 LLM 的能力令人印象深刻…

electron教程(一)创建项目

一、方式① 根据官网描述将electron/electron-quick-start项目克隆下来并启动 electron/electron-quick-start地址&#xff1a; GitHub - electron/electron-quick-start: Clone to try a simple Electron app git clone https://github.com/electron/electron-quick-start…

Laravel介绍与学习入门

Laravel 是一款优雅且功能强大的 PHP Web 开发框架&#xff0c;它被广泛认为是 PHP 领域内构建现代 Web 应用程序的最佳选择之一。Laravel 提供了一套简洁、富有表现力的语法&#xff0c;使得开发者能够高效地编写清晰、可维护的代码。以下是 Laravel 的一些关键特点和入门概念…

实战项目——用Java实现图书管理系统

前言 首先既然是管理系统&#xff0c;那咱们就要实现以下这几个功能了--> 分析 1.首先是用户分为两种&#xff0c;一个是管理员&#xff0c;另一个是普通用户&#xff0c;既如此&#xff0c;可以定义一个用户类&#xff08;user&#xff09;&#xff0c;在定义管理员类&am…

DMA学习笔记

参考文章 https://blog.csdn.net/as480133937/article/details/104927922 DMA简介 DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。DMAC 即 DMA 控制器&#xff0c;提供了一种硬件的数据传输方式&#xff0c;无需 CPU 的介入&#xff0c;可以处理外…

7.6、指针和数组

代码 #include <iostream> using namespace std;int main() {//指针和数组//利用指针访问数组中的元素int arr[10] { 1,2,3,4,5,6,7,8,9,10 };cout << "第一个元素为&#xff1a;" << arr[0] << endl;int * p arr;//arr就是数组首地址co…

kaggle量化赛金牌方案(第七名解决方案)(下)

— 无特征工程的神经网络模型&#xff08;得分 5.34X&#xff09; 比赛进入最后阶段&#xff0c;现在是时候深入了解一些关于神经网络模型的见解了。由于 Kaggle 讨论区的需求&#xff0c;我在这里分享两个神经网络模型。第一个是 LSTM 模型&#xff0c;第二个是卷积网络&…

鸿翼FEX文件安全交换系统,打造安全高效的文件摆渡“绿色通道”

随着数字经济时代的到来&#xff0c;数据已成为最有价值的生产要素&#xff0c;是企业的重要资产之一。随着数据流动性的增强&#xff0c;数据安全问题也随之突显。尤其是政务、金融、医疗和制造业等关键领域组织和中大型企业&#xff0c;面临着如何在保障数据安全的同时&#…

llm学习-3(向量数据库的使用)

1&#xff1a;数据读取和加载 接着上面的常规操作 加载环境变量---》获取所有路径---》加载文档---》切分文档 代码如下&#xff1a; import os from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv()) # 获取folder_path下所有文件路径&#xff0c;储存在…

【力扣 - 每日一题】3099. 哈沙德数 | 模拟 (Go/C++)

题目内容 如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&#xff1…

中国国产AI芯片的崛起

一、CUDA的垄断 当讨论半导体行业面临的挑战时&#xff0c;你首先想到的是什么&#xff1f;光刻机&#xff1f;3纳米或者5纳米技术&#xff1f;我们无法生产的完美方形芯片&#xff1f;是的&#xff0c;但也不完全是。 人们经常把半导体芯片归类为硬件产业&#xff0c;但实际上…

【大模型LLM面试合集】大语言模型基础_llm概念

1.llm概念 1.目前 主流的开源模型体系 有哪些&#xff1f; 目前主流的开源LLM&#xff08;语言模型&#xff09;模型体系包括以下几个&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列&#xff1a;由OpenAI发布的一系列基于Transformer架构…

惊艳眼球的视觉盛宴【二】

当晨光初破黎明的静谧&#xff0c;一片绚烂便悄然铺展在蔚蓝的天际。那一刻&#xff0c;大地苏醒&#xff0c;万物复苏&#xff0c;我们仿佛踏入了一幅活生生的画卷。雾气缭绕之中&#xff0c;群山似乎在低语&#xff0c;古树在轻摇&#xff0c;一切都沐浴在柔和而金黄的光芒之…

战略流程-麦肯锡企业数字化业务变革成熟度评估模型及案例深度解析

一、企业变革成熟度评估模型 企业变革成熟度诊断模型是一种评估工具&#xff0c;用于全面扫描和评估企业在变革转型过程中的能力水平。该模型通过一系列量化指标和定性分析&#xff0c;对企业在不同变革领域的成熟度进行评分&#xff0c;从而帮助企业识别在变革过程中的优势和…