【算法篇-排序】八大排序

news2025/1/18 6:43:54

十大排序

  • 0.常见排序
  • 1. 插入排序(直接插入排序和希尔排序)
    • 1.1直接插入排序
    • 1.2希尔排序(缩小增量排序)
  • 2.选择排序
    • 2.1选择排序
  • 2. 2堆排序
  • 3.交换排序
    • 3.1 冒泡排序
    • 3.2快速排序
      • 3.2.1hoare版本快排
      • 3.2.2挖坑法
      • 3.2.3前后指针法
      • 3.3.4 快排的非递归形式
      • 3.3.5快排的优化(随机选key优化)
  • 4.归并排序
    • 4.1 归并排序非递归形式
  • 5.计数排序

0.常见排序

本篇文字会先讲解常见的七大排序,如图所示
最后会有计数排序

在这里插入图片描述

1. 插入排序(直接插入排序和希尔排序)

1.1直接插入排序

直接插入排序是一种简单的插入排序法,其基本思想就是把待排序的数值逐一插入到前面以及排好序的元素中,直到全部有序为止。

就如同我们调整扑克牌一样,挑出来一张牌看看前面的数是否比我大,比我大的话我就继续往前对比,直到前一张比我小为止,然后插在后面。
在这里插入图片描述

步骤:
1.从第一个元素开始,第一个元素默认为已经排好序。
2.取下一个元素val,与前面的元素逐一比较,如果前面的元素比val大,那么这个元素往后挪,val继续往前比较,如果遇到元素比val小,那么val就插到这个元素后面。如果val比前面的元素都小,那就放在第一个位置。
3.继续取下一个元素,重复2步骤,当取到最后一个元素并排序完成时,整个数组就是有序的了。

动图演示:

在这里插入图片描述

代码思路:一开始,第一个元素是有序的,那么我们取有序序列最后元素的下标,将有序序列后一个插入进来,当按规定插入进来后,有序序列元素增加一位,我们再取有序序列最后元素的下标,将有序序列后一个插入进来,一直循环 n - 1次,数组就变得有序了。

void insertSort(int*a,int n)//a是要排序的数组,n是数组大小
{
    int end = 0,val = 0;
    for(int i = 0;i < n - 1;i++)//注意这里是 n - 1
    {
       //end记录有序序列最后一个元素的下标
        end = i,val = a[end + 1];//拿有序序列后面的最开始的元素。
        //单趟排序
        while(end >= 0) //到下标0为止
        {
            if(val < a[end])//如果val比前面的数还小,就继续往前比较。
            {
                a[end + 1] = a[end];//把比较的数往后挪
                end --;//end--,为了下次继续往前比较
            }
            else //如果前面的数比val还小,就直接break
            {
                break;
            }
        }
        a[end + 1] = val;//将val插入到比val小的数后面
        //继续下一趟for循环
    }
}

在这里插入图片描述
复杂度分析

时间复杂度:
最坏的情况,逆序 O(n2
比如 从第二个数开始,往前比较 1 次
到第三个数,往前比较2次
到第四个数,往前比较3次,
到第n个数,往前比较n - 1次
1 + 2 + 3 +…+ n -1 ,是一个等差数列,求和可得
(n2 - 2n + 1)/ 2 ,是一个 n2级别时间复杂度
最好情况,有序,或者接近有序 O(n)
有序情况下,每个数都比前面的数大,所以只需比较一次即可,这时候把数组走完就仅仅达到O(n)级别
空间复杂度:O(1),未开辟额外的数组。

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

希尔排序是直接插入排序的一种优化版本
其思想是:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

当增量到减小到1时,就是上面所说的直接插入排序,增量大于1时所做的操作,叫做预处理我们的要排序的元素,使其接近有序,我们知道在有序时或者接近有序时,直接插入排序的时间复杂度时O(n)的。

在这里插入图片描述

如上图所示,选初始增量gap = 5,第一个数和第一个数后面第gap个数为一组,第二个数和第二个数后面第gap个数为一组。如图所示(9,4)(1,8)(2,6)(5,3)(7,5)各为一组。然后组内排序,整理成(4,9)(1,8)(2,6)(3,5)(5,7)
第一趟排序完成后,第二躺的gap要缩小增量,一般 除以2处理,保证最后的gap是1即可。

代码如下:

void shellSort(int* a, int n)//希尔排序,直接插入排序的优化版
{
	int gap = n, end = 0, tmp = 0;
	while (gap > 1)
	{
		gap = gap / 2;
		for (int i = 0; i < n - gap; i++) // 一共会有 n - gap 个组
		{
			end = i;
			tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

复杂度分析

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

《数据结构(C语言版》— 严蔚敏
在这里插入图片描述

《数据结构-用面相对象方法与C++描述》— 殷人昆
在这里插入图片描述

我们在这里取时间复杂度为O(n1.3)即可
空间复杂度为O(1)

2.选择排序

2.1选择排序

选择排序其基本思想就是:每次从待排序列里面选出一个最小值,然后将这个最小值放在待排序列的起始为止,直到排完即可。
在这里插入图片描述
代码如下

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void select(int* a,int n)
{
    int begin = 0;
    while(begin < n)
    {
        int mini = begin;
        for(int i = begin + 1;i < n;i++)
        {
            if(a[mini] > a[i])
            {
                mini = i;
            }
        }
        swap(&a[mini],&a[begin]);
        begin++;
    }
}

复杂度分析

时间复杂度O(n2
空间复杂度O(1)

2. 2堆排序

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

过程如图所示

建好大堆后,每次把堆顶的元素与堆最后的元素交换,然后堆顶向下调整到相应为止。
第二个选择倒数第二个与堆顶交换,然后堆顶向下调整到相应为止。
如此反复直到选到堆顶的数为止,此时堆已经排好序。

在这里插入图片描述

在建堆的过程中需要用到建堆算法,具体可以看看这篇文章

代码实现:

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void down(int* a,int n,int parent)  //向下调整法代码
{
    int child = 2 * parent + 1;
    while(child < n)
    {
        if(child + 1 < n && 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)
{
    for(int i = (n - 1 - 1) / 2;i >= 0;i--) //建堆
    {
        down(a,n,i);
    }
    int end = n - 1;
    while(end >= 0)
    {
        swap(&a[end],&a[0]);
        down(a,end,0);
        --end;
    }
}

复杂度分析:

时间复杂度:O(n * log2n)
空间复杂度O(1)

3.交换排序

3.1 冒泡排序

冒泡排序的思路就是两个元素之间两两比较,一趟走完后最大的元素一定在数组的最右边。
然后走第二趟,第二大的元素在数组的倒数第二个位置。
如此循环,有序为止。

在这里插入图片描述

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void bubbleSort(int* a,int n)
{
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < n - i - 1;j++)
        {
            if(a[j] > a[j + 1])
            {
                swap(&a[j],&a[j + 1]);
            }
        }
    }
}

复杂度分析:

时间复杂度:最坏的情况的下也是等差数列的时间复杂度分析,级别是:O(n2) 当然最好的情况是下O(n)的,比如顺序的情况。
空间复杂度O(1)

3.2快速排序

3.2.1hoare版本快排

思路:
1.从数组里面选出一个key,作为基准值。
2.定义一个L作为数组的开头,定义一个R作为数组的末尾。L在数组从左向右走,R在数组从右向左走。如果key是选取最左边的数,R先走,如果key是选取最右边的数,L先走。
3.我们假设选取数组最左边的数作为key,那么R先走,R走的过程中,如果R对应的数小于key,那么此时R停下,轮到L走,如果L走的过程中,碰到大于key的数,那么L停下。停下以后将L和R对应的值交换。然后继续R先走,如此进行下去,直到L和R相遇,将相遇点的内容和key交换即可。
4.从刚才相遇的点分隔开,分为左序列和右序列,都再次执行像3这样的步骤,一直操作下去,当序列只有一个数据或者数据不存在时,便停止操作,此时该序列有序。

单趟动图如下:
在这里插入图片描述
代码:

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void quickSort(int* a,int begin,int end)
{
    if(begin >= end) return;//当begin>=end,结束递归操作
    int L = begin,R = end,key = begin;//定义L,R,key下标
    while(L < R)
    {
        while(a[R] >= a[key] && L < R)//右边先走,右边大于等于key就一直走下去,否则停下来,加上判断L < R,防止越界
        {
            R--;
        }
        while(a[L] <= a[key] && L < R)//同理
        {
            L++; 
        }
        swap(&a[L],&a[R]);//都停下来后交换
    }
    swap(&a[key],&a[R]);//最后key值和相遇点交换
    key = R;//以相遇点作为分界点,递归操作
    quickSort(a,begin,key - 1);//递归
    quickSort(a,key + 1,end);
}

复杂度分析:

时间复杂度: O(n * log2n)
时间复杂度在原本就是顺序或者逆序的情况下可能达到n2级别,后面会做优化。
空间复杂度O(logn),因为建立了栈帧,开辟的额外的空间

3.2.2挖坑法

挖坑法与hoare法的基本思路类似
挖坑法的基本思路像hoare法一样,在最左边或者最右边选择一个基准值key,然后在该位置挖一个坑。
然后R先走,遇到比key小的就停下来,把这个值放到刚才的坑中,此时坑移到R位置。
然后L先走,遇到比key大的就停下来,把这个值放到刚才的坑中,此时坑移到L的位置。
一直进行下去,直到L和R相遇,最后把key值放到坑中。
然后以这个坑作为分割,分割为左序列和右序列,进行递归操作。

单趟动图演示:
在这里插入图片描述
代码:

void quickSort(int* a,int begin,int end)
{
    if(begin >= end) return;
    int L = begin,R = end,key = a[begin];
    int hole = L;
    while(L < R)
    {
        while(a[R] >= key && L < R)
        {
            R--;
        }
        a[hole] = a[R];
        hole = R;
        while(a[L] <= key && L < R)
        {
            L++; 
        }
        a[hole] = a[L];
        hole = L;
    }
    a[hole] = key;
    key = hole;
    quickSort(a,begin,key - 1);
    quickSort(a,key + 1,end);
}

3.2.3前后指针法

思路:
1、选出一个key,一般是最左边或是最右边的。
2、起始时,pre指针指向序列开头,cur指针指向prev+1。
3、若cur指向的内容小于key,则prev先向后移动一位,然后交换pre和cur指针指向的内容,然后cur指针++;若cur指向的内容大于key,则cur指针直接++。如此进行下去,直到cur到达end位置,此时将key和++prev指针指向的内容交换即可。

经过一次单趟排序,最终也能使得key左边的数据全部都小于key,key右边的数据全部都大于key。
然后也还是将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void quickSort(int* a,int begin,int end)
{
    if(begin >= end) return;
    int key = begin,pre = begin,cur = begin + 1;
    while(cur <= end)
    {
        while(a[cur] < a[key] && cur != pre)
        {
            swap(&a[cur],&a[++pre]);
        }
        cur++;
    }
    swap(&a[key],&a[pre]);
    key = pre;
    quickSort(a,begin,key - 1);
    quickSort(a,key + 1,end);
}

3.3.4 快排的非递归形式

这里借用栈来改成非递归形式。
主要思想就是利用栈来模拟递归形式,进而改成非递归。

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
//单趟排
int quickSort(int* a,int begin,int end)
{
    int key = begin,pre = begin,cur = begin + 1;
    while(cur <= end)
    {
        while(a[cur] < a[key] && cur != pre)
        {
            swap(&a[cur],&a[++pre]);
        }
        cur++;
    }
    swap(&a[key],&a[pre]);
    key = pre;
    return key;//返回分割点
}
void nonRquick(int* a,int begin,int end)
{
    stack<int> s;
    s.push(begin);//先入左
    s.push(end);//再入右
    while(!s.empty())
    {
        int right = s.top();//得到右下标
        s.pop();//弹出
        int left = s.top();//得到左下标,现在得到一个区间
        s.pop();//弹出
        
        int key = quickSort(a,left,right);//调用函数,执行这个区间的单趟排序,然后得到区间的分割点,接着入栈
        
        if(right > key + 1) //如果有右下标没有大于key + 1就入栈
        {
            s.push(key + 1); //先入左
            s.push(right);//再入右
        }
        if(left < key) //如果左下标没有大于key就入栈
        {
            s.push(left);//先入左
            s.push(key);//再入右
        }
    }
}

3.3.5快排的优化(随机选key优化)

当数组里面存在大量的重复数据或者都是重复数的时候,我们的快排的就会退化为 n2级别的排序。
比如{1,1,1,1,1,1,1,1,1,1…}一个数组有很多个1,我们的key始终选在最左边或者最右边的话,快排的效果是非常差的。
所以,基于这个key的选取,我们有三数取中优化和随机选key优化。
常用方法是随机选key

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void quickSort(int* a,int begin,int end)
{
    if(begin >= end) return ;
    int mid = begin + rand() % (end - begin);//让随机在end - begin内
    swap(&a[begin],&a[mid]);//将随机的key与第一个数交换一下
    int key = begin,pre = begin,cur = begin + 1;
    while(cur <= end)
    {
        while(a[cur] < a[key] && cur != pre)
        {
            swap(&a[cur],&a[++pre]);
        }
        cur++;
    }
    swap(&a[key],&a[pre]);
    key = pre;
    quickSort(a,begin,key - 1);
    quickSort(a,key + 1,end);
}

4.归并排序

基本思想:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:
在这里插入图片描述

在这里插入图片描述

其基本思路就是先把数组一个个分割开,分割到只剩一个的时候,在返回进行归并到另外一个数组里面,再拷贝回原数组。

代码:

void _mergeSort(int* a, int begin, int end, int *tmp)
{
	if (begin >= end) return;

	int mid = (begin + end) / 2;//每次从之间分割
	_mergeSort(a, begin, mid, tmp);//递归分割
	_mergeSort(a, mid + 1, end, tmp);

	int begin1 = begin, end1 = mid;
	int begin2 = mid + 1, end2 = end;
	int i = begin;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] <= a[begin2])
		{
			tmp[i++] = a[begin1++];
		}
		else
		{
			tmp[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");
		exit(-1);
	}
	_mergeSort(a,0,n - 1,tmp);

	free(tmp);
	tmp = NULL;
}

复杂度分析: 时间复杂度:严格意义上的O(n * log2n)
空间复杂度:O(n)

4.1 归并排序非递归形式

void mergeSort_nonRE(int* a, int n)//归并排序非递归
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	int range = 1;
	while (range < n)
	{
		for (int i = 0; i < n; i += 2 * range)
		{
			int begin1 = i, end1 = i + range - 1;
			int begin2 = i + range, end2 = i + 2 * range - 1;
			int j = i;
			if (end1 >= n)
			{
				break;
			}
			else if (begin2 >= n)
			{
				break;
			}
			else if (end2 >= n)
			{
				end2 = n - 1;
			}

			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] <= a[begin2])
				{
					tmp[j++] = a[begin1++];
				}
				else
				{
					tmp[j++] = a[begin2++];
				}
			}
			while (begin1 <= end1)
			{
				tmp[j++] = a[begin1++];
			}
			while (begin2 <= end2)
			{
				tmp[j++] = a[begin2++];
			}
			memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));
		}
		range *= 2;
	}
	free(tmp);
	tmp == NULL;
}

5.计数排序

计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。
主要思想是利用数组统计每个数出现的次数,然后根据出现的次数进行排序。
由于数据的范围可能是负数,也可能是过大的数据,我们不可能开出负数下标的数组,也应避免牺牲太大的空间存放对应值的下标。
所以我们采用 映射的关系,即将某些值利用某种方法对应到相应的下标。

我们这里先算出数据的最大范围,开出相应大小的数组。
比如数据是 1001 1002 1003 1004 1005
最大值是1005 最小值是1001,
最大值减最小值等于5,所以数组的大小是5。
映射关系是: a[元素 - 最小值],比如a[1001-1001],就是a[0],所以
a[0]存放着1001这个数。
这种映射关系巧妙地解决了负数和数据过大等问题。

代码:

void countSort(int* a, int n)//计数排序
{
	int max1 = a[0], min1 = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] > max1)
		{
			max1 = a[i];
		}
		if (a[i] < min1)
		{
			min1 = a[i];
		}
	}
	int range = max1 - min1 + 1;
	int* count = (int*)calloc(range, sizeof(int));
	if (count == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	for (int i = 0; i < n; i++)
	{
		count[a[i] - min1] ++;//利用哈希的方法计数
	}
	int k = 0;
	for (int i = 0; i < range; i++)
	{
		while (count[i]--)
		{
			a[k++] = i + min1;
		}
	}
	free(count);
	count = NULL;
}

复杂度分析:

时间复杂度O(N + range)
空间复杂度O(N)

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

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

相关文章

【Linux】在Linux上写一个进度条小程序

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;安度因的学习社区 &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、理解 \r 与 \n三、行缓冲1、提出问题2、认识行缓冲3、解答与拓展4、倒计时四、进度条五、结语如果无聊的话&#…

2023/1/12总结

今天学习了图的割点与桥的算法 图的割点以及桥 图的割点&#xff1a;割点是指在无向连通图中&#xff0c;某点和该点连接的边去掉以后图便不再连通 在上面的图片中&#xff08;上面是一个有向图&#xff0c;我们当作无向图即可&#xff09;我们知道当我们去掉A点之后&#xf…

进阶必看 | 6个让Revit建模起飞的习惯,高效就靠它

大家好&#xff0c;这里是建模助手。 相信各位都知道&#xff0c;建模助手一向以来都追求更高&#xff0c;更快&#xff0c;更强。但是有些问题&#xff0c;不是插件本身能解决的事情&#xff0c;而是项目本身的问题。 一般来说&#xff0c;当Revit项目模型大于150MB时&#…

Linux安装sonarqube(含各种错误处理)

目录 1.下载安装 2.错误处理 2.1.JDK版本不适配 2.2.can not run elasticsearch as root 1.下载安装 下载地址&#xff1a; Download | SonarQube | Sonar &#xff08;下载页面向下拉&#xff09;选择稳定版本下载。 解压后启动脚本在&#xff1a; bin/{对应操作系统}…

【dp】买卖股票的最佳时机系列题目

文章目录121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II309. 最佳买卖股票时机含冷冻期123. 买卖股票的最佳时机 III188. 买卖股票的最佳时机 IV121. 买卖股票的最佳时机 本题的重点是&#xff1a;只能在前面某一天买入&#xff0c;后面某一天卖出。要不就是不买入&#x…

外贸业务员怎样能提高自己的工作能力?

关于外贸业务员提高自己的工作能力&#xff0c;米贸搜整理如下&#xff0c;希望可以帮助到你&#xff1a;1.树立一个好的目标&#xff0c;并坚定不移地朝着这个目标努力。这个问题&#xff0c;无论你是新手还是有经验的外贸业务员&#xff0c;相信每个外贸业务员都或多或少的思…

K_A11_004 基于STM32等单片机采集热敏传感参数串口与OLED0.96双显示

K_A11_004 基于STM32等单片机采集热敏传感参数串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线说明1.1、STC89C52RC热敏传感模块1.2、STM32F103C8T6热敏传感模块五、基础知识学习与相关资料下…

NCS8823替代方案|CS5260Typec转VGA可替代NCS8823|低BOM成本替代NCS8823设计

NCS8823替代方案|CS5260Typec转VGA可替代NCS8823|低BOM成本替代NCS8823设计 NCS8823是一款低功耗、DisplayPort信号至VGA转换器,通过USB Type-C连接器。它是 适用于USB Type-C至VGA转换器&#xff0c;适配器、对接设备。此设备结合了基于USB Type-C的 DisplayPort接收器和VGA…

华为私有云平台FusionCompute搭建

一、FusionCompute架构 架构CNA作为虚拟化操作系统&#xff0c;VRM作为虚拟化管理平台正常主机都安装CNA&#xff0c;单独建立VRM集群作为管理集群&#xff0c;我测试环境就一台主机&#xff0c;所以CNA和VRM装在同一台主机上&#xff0c;并且用这台主机分配虚拟机进行测试。 …

前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值

作用域 作用域指&#xff1a;变量或函数的有效使用范围&#xff0c;有全局作用域与局部作用域两种。 全局变量和局部变量 全局变量&#xff1a;直接在 script 标签下声明的变量&#xff0c;任何地方都能访问&#xff0c;任何地方都能对其值进行改变。 局部变量&#xff1a;函…

CAN总线的个人理解

部分内容可以参考&#xff1a;https://blog.csdn.net/xwwwj/article/details/105372234? CAN概念简介 CAN是Controller Area Network 的缩写 CAN协议经过ISO标准化后有两个标准&#xff1a;ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通…

适合制造业的ERP推荐?使用ERP系统的好处有哪些?

对于制造型企业来说&#xff0c;除了涉及到产品的生产制造和原料采购&#xff0c;还需要管理库存、销售、财务等方方面面。制造业的ERP系统的使用&#xff0c;尤为重要。一个好的制造业的ERP系统在企业管理中起到至关重要的作用&#xff0c;针对制造业的ERP系统提供贴合行业特性…

用cmd命令窗口运行第一个java程序同时分享idea写的代码用cmd编译运行【建议收藏】

在上一篇文章https://blog.csdn.net/qq_52545155/article/details/128651296?spm1001.2014.3001.5502教大家安装了jdk版本&#xff0c;那么我们来编写一个java程序&#xff0c;通过cmd命令运行起来看看效果叭&#xff01;&#xff01;&#xff01; 一、基本代码准备 1、打开记…

超全的SQL注入姿势总结

目录 常见姿势 环境搭建 信息收集 报错注入 延时注入 布尔注入 堆叠注入 绕过方法 绕过引号 or and xor not绕过 绕过注释符 内联注释绕过 类型转换绕过 绕过 WAF绕过-应用层 常见姿势 环境搭建 use mysql; create table if not exists my_table( id int PRIMA…

HC小区管理系统安装记录一次群里小伙伴梓豪方式安装问题

记录一次群里小伙伴安装&#xff0c;供大家参考 问题排查 打开梓豪地址查看 Redis MySQL Nginx 是否启动成功&#xff0c;查看日志启动成功 MySQL正常 redis 没有报错 Nginx也正常 查看hc 是否启动成功&#xff0c;点击控制台 查看docker 发现8008 端口被占用了&#xff0c…

【异常】原来提示SocketTimeoutException:connect timed out还可能是外部因素导致

一、现象截图 一大早收到ELK的邮件提醒&#xff0c;让我来看看&#xff0c;又是哪个妖怪在作孽&#xff1f; 二、问题定位 2.1 SocketTimeoutException:connect timed out 经验告诉我&#xff0c;这个问题一般是第三方平台的问题&#xff0c;大部分原因是发起Http请求&…

惠普M329打印机更换副厂硒鼓后提示墨粉不足并无法打印

买了一个惠普M329打印机,打印效果不错,速度快,大量复印比较方便。因为最近打印和复印比较多,很快原装墨粉用完了。又买了一个副厂(带芯片)的硒鼓换上。不到一个月,又用光了,这次买了同一个副厂的硒鼓(不带芯片)。将原来的芯片(副厂的)拆下来,装在新硒鼓上。装到M3…

喜讯!华秋电子荣获千峰奖“2022年度产业互联网百强”,持续为电子产业增效降本!

12月28日&#xff0c;2022全球数字贸易大会专题活动“跨境产业互联网峰会暨2022年度千峰之夜”在武汉隆重举行&#xff0c;大会聚集了全国产业互联网、跨境电商平台、数字经济、资本市场等嘉宾&#xff0c;共同探讨产业互联网公司出海的机会和路径。 亿邦动力董事长郑敏介绍&am…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (三)奇偶校验

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 &#xff08;三&#xff09;奇偶校验 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN博客 &#x1f9e8;未经作者允许&#xff0c;禁止转载 &#x1f511;系列专栏&#xff1a;牛客Verilog习…

房产管理系统平台架构安全需求分析

数图互通高校房产管理系统是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解决方案。…