数据结构(常见的排序算法)

1.插入排序

1.1直接插入排序

在[0  end]区间上有序,然后将(end+1)的数据与前面有序的数据进行比较,将(end+1)的数据插入,这样[0  end+1]区间上就是有序的,然后再向后进行比较。

例如:想要数据调整为升,数组(end+1)位置的数据,前面是比它小的数据,后面是比它大的数据。

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

动图显示:

实现代码:

//插入排序(升序)
void intsertsort(int* arr, int num );

 

参数:指向数组首元素的指针,数组中的元素个数

//插入排序(升序)
void intsertsort(int* arr, int num )
{
	for (int i = 0;i<num-1;i++)
	{
		//只考虑一次排序,在[0,end]上是有序的
		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;
	}
		

}

1.2希尔排序

希尔排序是从直接插入排序演化而来的,分为两步,一个步是预处理,另一步是直接插入排序。

预处理:预处理是将原来的数据处理的尽可能有序,让数据尽可能的在最终排序完成的位置附近,这样就可以避免直接插入排序 数组(end+1)位置的数直接与[0  end]这个区间的数全部比较。

时间复杂度:O(N*logN) 

动图演示:

实现代码:

//希尔排序

void shellsort(int* arr, int num);

函数参数:指向数组首元素的指针,数组中的元素个数

//希尔排序(升序)
#include<stdio.h>
//*希尔排序
//*1.预排序
//*2.插入排序
//*时间复杂度O(N^1.3)
//*

void shellsort(int* arr, int num)
{
	int gap = num;
	while (gap > 1)
	{
		//保证最后一次是1,gap不是1时实现预排序,是1时实现插入排序
		gap = gap / 3 + 1;
		for (int i = 0; i < num - gap; i++)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if (tmp < arr[end])
				{
					arr[end + gap] = arr[end];
					end=end-gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;

			
		}
		
	}
	


}

注:在gap不等于1的时候,是在执行预处理,当gap等于1的时候实在实现直接插入排序。

2.选择排序

2.1选择排序

选择排序,就是一趟选择出一个数组中的一个最大值或者最小值

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

动图演示: 

实现代码:

//选择排序
void selectsort(int* arr, int num)

函数参数:指向数组首元素的指针,数组中的元素个数

//交换函数
void swap(int*x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

//选择排序
void selectsort(int* arr, int num)
{
	//提升效率,可以同时进行最大值和最小值的排序
	int begin = 0, end = num ;
	while (begin < end)
	{
		int imin = begin, imax = begin;
		for (int i = begin; i < end; i++)
		{
			if (arr[i] > arr[imax])
			{
				imax = i;
			}

			if (arr[i] < arr[imin])
			{
				imin = i;
			}
		}

		if (begin == imax)
			imax = imin;

		//放置最小值和最大值
		swap(&arr[imin], &arr[begin]);
		swap(&arr[imax], &arr[end - 1]);

		begin++;
		end--;
	}
	

}

注:实现函数中是一趟找出数组中的最大值和最小值,这算是一种优化。

2.2堆排序 

先堆数组进行堆排序,升序建大堆,降序建小堆,下面用小堆举例子,数组的首元素一定是数组的最大数,将首元素与数组的最后一个数进行交换,然后对数组[0  end-1]区间进行向下调整。继续,直到真个数组有序。

时间复杂度:O(N*logN)

动图演示:

注:上面演示的数组一开始已经建大堆。

实现代码:

//向下调整函数
void downjust_big(HPDataType* root, int num,int tmp)

参数:指向数组首元素的指针,数组中的元素个数,需要向下调整的位置

//向下调整创建大堆
void downjust_big_heap(HPDataType* arr, int num)

参数:指向数组首元素的指针,数组中的元素个数

//大堆升序
void downjust_arry_up(HPDataType* arr, int num)

参数:指向数组首元素的指针,数组中的元素个数

//交换函数
void Swap(HPDataType* x, HPDataType* y)

参数:指向需要交换元素的两个指针

//交换函数
void Swap(HPDataType* x, HPDataType* y)
{
	HPDataType tmp = *x;
	*x = *y;
	*y = tmp;
}


//向下调整函数
void downjust_big(HPDataType* root, int num,int tmp)
{
	assert(root);
	int parent = tmp;

	//假设左孩子和右孩子中大的那个是左孩子
	int child = parent * 2 + 1;

	//如果孩子节点不在堆中,就直接结束
	while (child < num)
	{
		//(1)如果右孩子大于左孩子
		//(2)如果没有右孩子,那么左孩子一定是最大的
		if (root[child] < root[child + 1] && (child + 1) < num)
		{
			//将最大的孩子修改为右孩子
			child++;
		}

		if (root[parent] < root[child])
		{
			Swap(&root[parent], &root[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			//直接跳出循环
			break;
		}
	}
}


//向下调整创建大堆
void downjust_big_heap(HPDataType* arr, int num)
{
	assert(arr);
	for (int i = (num - 2) / 2; i >= 0; i--)
	{
		downjust_big(arr, num, i);
	}
}


//大堆升序
void downjust_arry_up(HPDataType* arr, int num)
{
	assert(arr);
	downjust_big_heap(arr, num);
	while (num)
	{
		Swap(&arr[0], &arr[num - 1]);
		num--;
		downjust_big(arr, num, 0);
	}
}

3.交换排序 

3.1冒泡排序 

冒泡排序,实际上就是两两比较,满足条件的两两交换,一趟可以选择出数组中的最大值后者最小值(取决于升序还是降序),直到将数据中的全部数据排序完成。

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

动图演示: 

实现代码:

//冒泡排序

void BubbleSort(int* arr, int n) ;

函数参数:指向数组首元素的指针,数组中的元素个数

//冒泡排序(升序)
//* 时间复杂度O(N^2)

void swap(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

void BubbleSort(int* arr, int n)
{
	
	for (int j = 0; j < n-1; j++)
	{
		int flag = 1;
		//一次遍历
		for (int i = 0; i < n -j- 1; i++)
		{
			if (arr[i] > arr[i + 1])
			{
				swap(&arr[i], &arr[i + 1]);
				flag = -1;
			}
		}
		if (flag == 1)
			break;
	}
	


}

3.2快速排序  

快速排序:就是选择一个数据,将数组中的数分为小于该数和大于该数的两个部分,小于该数的部分在该数的左边,大于的放在该数的右边。然后该数的位置为分界,然后在两个小区间重复上面的操作。 

时间复杂度:O(N*logN) 

代码演示:

hoare法:

 挖坑法:

前后指针法:

初学者适合先看挖坑法进行一个理解。 

实现代码:

//快速排序(hoare)
void QuickSort(int* arr, int left, int right)
 ;

参数:指向数组首元素的指针,指向数组最左边位置,指向数组最右边位置

//快速排序
void QuickSort(int* arr, int left, int right)
{

	if (left >= right)
		return;


	int begin = left, end = right;
	int keyi = begin;


	while (begin < end)
	{
		//左边当钥匙时,是右边开始移动

	//当找到一个比keyi小的数字时,停下来
		while (begin<end && arr[end] >= arr[keyi])
		{
			end--;
		}

		//右边开始移动
		while (begin<end && arr[begin] <=arr[keyi])
		{
			begin++;
		}

		swap(&arr[begin], &arr[end]);
	}
	//begin和end相遇
		swap(&arr[keyi], &arr[end]);
	    keyi = begin;
	

	//接下来就是递归
	//标准值左右两边
		QuickSort(arr, left, keyi - 1);
		QuickSort(arr, keyi+1,right);

}

注:选择最左边的数为标志数,那么那就不许从右边进行开始比较。 

//快速排序(挖坑法)
void QuickSort(int* arr, int left, int right);

参数:指向数组首元素的指针,指向数组最左边位置,指向数组最右边位置

//快速排序(挖坑法)
void QuickSort(int* arr, int left, int right)
{

	if (left >= right)
		return;


	

	int begin = left, end = right;

	int keyi = arr[left];


	while (begin < end)
	{
		//左边当钥匙时,是右边开始移动

	//当找到一个比keyi小的数字时,停下来
		while (begin < end && arr[end] >=keyi)
		{
			end--;
		}
		arr[begin] = arr[end];
		//右边开始移动
		while (begin < end && arr[begin] <= keyi)
		{
			begin++;
		}
		arr[end] = arr[begin];
	}
	//begin和end相遇
	arr[end] = keyi;
	keyi = begin;
	//接下来就是递归
	//标准值左右两边
	QuickSort(arr, left, keyi - 1);
	QuickSort(arr, keyi + 1, right);

}

//快速排序(前后指针法) 

void QuickSort(int* arr, int left, int right)

参数:指向数组首元素的指针,指向数组最左边位置,指向数组最右边位置

void QuickSort(int* arr, int left, int right)
{

	if (left >= right)
		return;


	int prev = left, cur = left + 1;

	int keyi = left;

	while (cur<=right)
	{
		//cur指针找比arr[keyi]小的数值
		if (arr[cur] < arr[keyi] && arr[++prev] != arr[cur])
			swap(&arr[cur], &arr[prev]);

		cur++;
	}
	
	swap(&arr[keyi], &arr[prev]);
	keyi = prev;
	
	//接下来就是递归
	//标准值左右两边
	QuickSort(arr, left, keyi - 1);
	QuickSort(arr, keyi + 1, right);

}

由于快速排序使用递归,如果数据过大,就很容易出现栈的溢出,因此需要改为非递归。

//快速排序(非递归)

实际上,非递归是使用了递归的逻辑,只不过是使用栈数据结构来储存需要进行快速排序的两个区间。

void QuickSortNonR(int* arr, int left, int right) 

参数:指向数组首元素的指针,指向数组最左边位置,指向数组最右边位置

//栈的定义
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;		// 栈顶(指向栈顶元素的下一位)
	int capacity;  // 容量 
}Stack;

// 初始化栈 
void StackInit(Stack* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

// 入栈 (对应顺序表的尾插)
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	//判断插入时的空间
	if (ps->top == ps->capacity)
	{
		//判断栈是否申请空间
		ps->capacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* new = (STDataType*)realloc(ps->a, ps->capacity * sizeof(STDataType));
		if (new == NULL)
		{
			perror("StackPush::realloc");
		}
		else
		{
			ps->a = new;
		}
	}

	//尾插
	ps->a[ps->top] = data;
	ps->top++;
}

// 出栈 (对应于顺序表的尾删)
void StackPop(Stack* ps)
{
	assert(ps);
	ps->top--;
}

// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->a[ps->top-1];
}

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);
	//栈为空返回1,栈不为空返回0
	if (ps->top == 0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

// 销毁栈 
void StackDestroy(Stack* ps)
{
	assert(ps);
	ps->capacity = ps->top = 0;
	free(ps->a);
	ps->a = NULL;
}

//快速排序(非递归)
void QuickSortNonR(int* arr, int left, int right)
{
	//非递归实际上就是使用栈来模拟递归
	Stack ps;
	StackInit(&ps);

	//将区间数放入栈中
	StackPush(&ps, left);
	StackPush(&ps, right);

	while (StackEmpty(&ps))
	{
		//取出栈的区间
		int end = StackTop(&ps);
		StackPop(&ps);
		int begin = StackTop(&ps);
		StackPop(&ps);
		//去除区间只有一个数值,和区间没有数值
		if (begin < end)
		{
			int keyi = begin;
			int prev = begin;
			int cur = begin + 1;
			while (cur <= end)
			{
				if (arr[cur] < arr[keyi] && arr[++prev] != arr[cur])
					swap(&arr[cur], &arr[prev]);
				cur++;
			}
			swap(&arr[keyi], &arr[prev]);
			keyi = prev;

			//添加小区间,先添加右区间,在添加左区间
			StackPush(&ps, keyi + 1);
			StackPush(&ps, end);
			StackPush(&ps, begin);
			StackPush(&ps, keyi - 1);
		}
	}

	//销毁栈
	StackDestroy(&ps);

}
 3.2.1快速排序优化(三数取中)

如果我们只是单一的选择数组的首元素作为比较的标志数,那么我们就很容易取到过于大或者过于小的数,那么我们的时间复杂度就很容易偏向于O(N^2) ,所以使用三数取中,其取数组的首元素,尾元素和中间元素,在这个三个数中取中间的数,然后将中间的数与数组首位置的数据交换,然后进行一个快速排序。

代码实现:

//三数取中
int ThreeNumMiddle(int* arr, int left, int right) 

参数:指向数组首元素的指针,指向数组最左边位置,指向数组最右边位置

//三数取中
int ThreeNumMiddle(int* arr, int left, int right)
{
	int middle = (right + left) / 2;
	if (arr[left] > arr[right])
	{
		if (arr[right] > arr[middle])
			return right;
		else
		{
			if (arr[left] > arr[middle])
				return middle;
			else
				return left;
		}

	}
	else
	{
		if (arr[middle] > arr[right])
			return right;
		else
		{
			if (arr[left] > arr[middle])
				return left;
			else
				return middle;
		}
	}
}

3.2.2快速排序优化(小区间优化) 

快速排序是一个前序遍历,这个排序的区间的划分上很像二叉树,最终小区间的数量会非常多,其实当区间足够小的时候,不同排序之间的时间差异不是很大,当区间差小于一个数时,使用直接插入排序,这样会很节约很多分区间的时间花费。 

//小区间优化  

//三数取中
int ThreeNumMiddle(int* arr, int left, int right)
{
	int middle = (right + left) / 2;
	if (arr[left] > arr[right])
	{
		if (arr[right] > arr[middle])
			return right;
		else
		{
			if (arr[left] > arr[middle])
				return middle;
			else
				return left;
		}

	}
	else
	{
		if (arr[middle] > arr[right])
			return right;
		else
		{
			if (arr[left] > arr[middle])
				return left;
			else
				return middle;
		}
	}
}


//插入排序(升序)
void intsertsort(int* arr, int num)
{
	for (int i = 0; i < num - 1; i++)
	{
		//只考虑一次排序,在[0,end]上是有序的
		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 QuickSort(int* arr, int left, int right)
{

	if (left >= right)
		return;

	//小区间优化
	//在小区间中使用快速排序
	if ((right - left) <= 5)
	{
		intsertsort(arr + left, right - left + 1);
		return;
	}


    //三数取中
	int middle = ThreeNumMiddle(arr, left, right);
	swap(&arr[left], &arr[middle]);

	int prev = left, cur = left + 1;

	int keyi = left;

	while (cur<=right)
	{
		//cur指针找比arr[keyi]小的数值
		if (arr[cur] < arr[keyi] && arr[++prev] != arr[cur])
			swap(&arr[cur], &arr[prev]);

		cur++;
	}
	
	swap(&arr[keyi], &arr[prev]);
	keyi = prev;
	
	//接下来就是递归
	//标准值左右两边
	QuickSort(arr, left, keyi - 1);
	QuickSort(arr, keyi + 1, right);

}

4.归并排序 

4.1归并排序 

归并排序,如其其名,先归,指将数组进行一个划分将区间中只剩一个数,然后将这个区间与它相邻的区间进行比较,将两个区间的数据进行一个排序,插入到一个中间数组中。 

动图演示:

代码实现:

 //归并排序(递归版)
void MergeSort(int* arr, int num)

参数:指向数组首元素的指针,数组中元素的数量

//子函数(实现主要功能)(递归)
void _MergeSort(int* arr, int* tmp, int left, int right)

参数:指向数组首元素的指针,指向中间临时数组首元素的地址,指向数组最左边位置,指向数组最右边位置 

//子函数(实现主要功能)(递归)
void _MergeSort(int* arr, int* tmp, int left, int right)
{

	//区间中只有一个数直接跳出循环
	if (left >= right)
		return;


	int middle = (left + right) / 2 ;
	//左区间
	_MergeSort(arr, tmp, left, middle);
	//右区间
	_MergeSort(arr, tmp, middle+1, right);

	int begin1 = left, begin2 = middle + 1;
	int end1 = middle, end2 = right;
	int i = begin1;


	//一次比较
	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 + left, tmp + left, sizeof(int) * (right - left + 1));

}





//归并排序(递归版)
void MergeSort(int* arr, int num)
{
	int* tmp = (int*)malloc(sizeof(int) * num);
	if (tmp == NULL)
	{
		perror("MergeSort::malloc");
		exit(1);
	}

	//调用子函数
	_MergeSort(arr, tmp, 0, num-1);

	//释放空间
	free(tmp);
	tmp = NULL;

}

//归并排序(非递归)
void MergeSortNonR(int* arr, int num) 

//子函数(非递归)
void _MergeSortNonR(int* arr, int* tmp, int left, int right)

//子函数(非递归)
void _MergeSortNonR(int* arr, int* tmp, int left, int right)
{
	

	int gap = 1;
	int n = right - left + 1;

	while (gap<n)
	{
		for (int j = left; j <=right;j=j+2*gap )
		{
			int begin1 = j, begin2 = j + gap;
			int end1 = j + gap - 1, end2 = j + 2*gap - 1;
			int i = j;

			//数组越界的问题
			//[begin1 end1]和[begin2 end2]


			//对应于end1大于n和begin2  > n的情况
			if (begin2 > right)
				break;
			//对应end2 > n 的情况
			if (end2 > right)
			{
				end2 = right;
			}


			//一次比较
			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 + j, tmp + j, sizeof(int)* (end2-j+1));

		}

		gap = 2 * gap;


	}

}


//归并排序(非递归)
void MergeSortNonR(int* arr, int num)
{
	int* tmp = (int*)malloc(sizeof(int) * num);
	if (tmp == NULL)
	{
		perror("MergeSort::malloc");
		exit(1);
	}

	//调用子函数
	_MergeSortNonR(arr, tmp, 0, num - 1);

	//释放空间
	free(tmp);
	tmp = NULL;
}

gap是一个区间差,区间差成倍数的增加,这样最终会出现一个越界的情况,每一次会分为连个区间 [begin1  end1]  [begin2  end2]  begin1是不可能越界的,越界的可能是end1 begin2 和end 2

end1越界:说明end1,begin2和end2都是越界的。这也就是说只有一个区间是有效区间,那么就不需要两个区间进行比较,直接退出。

begin2越界:这个情况和end1越界是一样的,只有一个有效区间,可以直接退出。

end2越界,说明有两个区间,一个区间有效,一个区间部分有效,end2越界说明它大于数组的最左边的位置,那么那个部分有效的区间中的有效区间实际上就是[begin2  right],直接将end2赋值为rigth,就可以进行两个区间的比较。

 总结 

         上面介绍了几种常见的数据结构的排序方法,一些排序的理解是比较复杂的,所以需要自己画相应的图,一步一步的推演排序的过程。同时有什么错误或者问题可以在评论区进行交流。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

验证码识别接口、多种样式验证码识别接口、中英文验证码识别接口

验证码识别接口、多种样式验证码识别接口、中英文验证码识别接口 本文提供一个基于OCR和机器学习的验证码识别接口&#xff0c;能够识别较复杂的中文、英文验证码&#xff0c;在OCR的基础上针对验证码进行算法优化。本接口是收费的&#xff08;最低0.5分1次调用&#xff0c;试…

单片机(STM32)与上位机传输浮点数

目录 单片机(STM32)与上位机传输数据的方法1. 传输整形数据2. 传输浮点数据3. 如何打包与解包 单片机(STM32)与上位机传输数据的方法 在进行单片机程序的开发时&#xff0c;常常需要与其他设备进行通信。一种情况是与其他电路板通信&#xff0c;比如STM32主机与STM32从机通信&…

CentOS7 MySQL5.7.35主从 不停机搭建 以及配置

如需安装MySQL&#xff0c;参照MySQL 5.7.35 安装教程 https://blog.csdn.net/CsethCRM/article/details/119418841一、主&从 环境信息准备 1.1.查看硬盘信息&#xff0c;确保磁盘够用&#xff08;主&从&#xff09; df -h1.2.查看内存信息 &#xff08;主&从&am…

基尼系数计算过程

引言 在探讨经济公平性时&#xff0c;基尼系数是一个不可忽视的指标。它不仅反映了一个国家或地区内部的收入分配状况&#xff0c;还对政策制定和社会稳定有着深远的影响。 基尼系数的定义 基尼系数是由意大利统计学家科拉多基尼在1912年提出的&#xff0c;用来衡量一个国家…

【T3】畅捷通T3软件查询明细账等账簿,出现某些列串位置。

【问题描述】 查询畅捷通T3软件科目明细账的时候&#xff0c; 出现某些行的数据串位置&#xff0c; 摘要、金额、方向都没有在对应的列。 【解决方案】 根据跟踪发现&#xff0c;最终在客户档案上发现问题。 数据串位中对应的客户名称、简称中的对后面多了一个【tab】键的空格…

Nodejs 第七十七章(MQ高级)

MQ介绍和基本使用在75章介绍过了&#xff0c;不再重复 MQ高级用法-延时消息 什么是延时消息? Producer 将消息发送到 MQ 服务端&#xff0c;但并不期望这条消息立马投递&#xff0c;而是延迟一定时间后才投递到 Consumer 进行消费&#xff0c;该消息即延时消息 插件安装 R…

【深度学习】NLP,Transformer讲解,代码实战

文章目录 1. 前言2. Transformer结构训练过程1. 输入嵌入和位置编码2. 编码器层2.1 单头的注意力机制(便于理解)2.2 多头的注意力机制(Transformer真实使用的)2.3 残差连接和层归一化2.4 前馈神经网络&#xff08;FFN&#xff09;2.5 残差连接和层归一化2.6 总结 3. 解码器层 推…

Jenkins构建 Maven项目(微服务)并自动发布

前面讲了docker 安装Jenkins和gitlab代码管理工具&#xff0c;接下来我们讲一下Jenkins怎么构建 Maven项目。 1. 首先Jenkins配置下面3中工具类 首先是在本地安装三个jenkins自动配置相关的工具 1.1 JDK 由于我们使用docker来启动jenkins&#xff0c;其自带有jdk&#xff0c;…

摩托罗拉手机在中国以外的市场复兴,在欧洲和美国大幅增长

摩托罗拉曾是全球手机行业的领导者&#xff0c;不过自从被诺基亚击败后&#xff0c;它就辗转被卖了又卖&#xff0c;曾经辉煌的品牌堕落了&#xff0c;让人颇为可惜&#xff0c;不过如今摩托罗拉手机似乎看到了复兴的希望&#xff0c;在中国以外的市场都取得了快速增长。 市调机…

BC11 学生基本信息输入输出

BC11 学生基本信息输入输出 废话不多说上题目&#xff1a; 这道题表面上很简单&#xff0c;但是里面有很重要的点先给大家上正确的代码&#xff1a; #include<stdio.h> int main() {int stu 0;float c 0;float English 0;float math 0;scanf("%d;%f,%f,%f"…

Unity API学习之消息机制理论与应用

目录 消息机制 示例1&#xff1a;同一物体中不同组件之间发送消息 示例2&#xff1a;父与子对象之间的消息发送(BroadcastMassage) 父对象向子对象发送消息 ​编辑 子对象向父对象发送消息 消息机制 在Unity中&#xff0c;SendMessage 方法用于在游戏对象及其所有子对象上…

Zabbix6.0自动发现Linux服务器并添加主机

文章目录 一、整体流程二、操作过程 一、整体流程 Zabbix自动发现主机功能是Zabbix监控系统的一个重要功能&#xff0c;它能够自动发现并添加新的主机到监控系统中&#xff0c;从而减少人为繁琐的操作&#xff01; 步骤操作1️⃣ 第一步创建自动发现规则2️⃣ ​第二步创建自…

汇编语言作业(五)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验结果与分析 五、 实验总结 一、实验目的 1.熟悉掌握汇编语言的程序结构&#xff0c;能正确书写数据段、代码段等 2&#xff0c;利用debug功能&#xff0c;查看寄存器&#xff08;CS,IP,AX,DS..)及数据段的…

Python集合的基本概念和使用方法

目录 集合&#xff08;Set&#xff09; 基本概念 基本特性 基本操作 集合运算 成员测试 高级操作 集合推导式 总结 集合&#xff08;Set&#xff09; Python集合&#xff08;Set&#xff09;是Python语言中一个非常实用且强大的数据结构&#xff0c;它用于存储多个不…

Python实现删除Word文档中带有“指定内容”的段落文本(7)

前言 本文是该专栏的第7篇,后面会持续分享Python办公自动化干货知识,记得关注。 在处理word文档内容的时候,有时候我们需要一个干净整洁的文本内容。比如说,如下图所示的情况: 在处理上述word文档内容的时候,我们希望将文本底部的“下载链接”以及“附件信息”两个段落,…

力扣199. 二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: [] /*** Def…

二叉树顺序结构——堆的结构与实现

二叉树顺序结构——堆的结构与实现 一、二叉树的顺序结构二、堆的概念及结构三、堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入(堆向上调整算法)堆的删除堆的代码实现(使用VS2022的C语言)初始化、销毁构建、插入、删除返回堆顶元素、判空、返回有效元素个数 四、完整 …

【Python教程】4-字符串、列表、字典、元组与集合操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

7.高级纹理

前面的基础纹理包括法线纹理、渐变纹理和遮罩纹理等。这些纹理都属于低纬&#xff08;一维或二维&#xff09;纹理。 立方体纹理&#xff08;Cubemap&#xff09;实现环境映射 渲染纹理&#xff08;Render Texture&#xff09; 程序纹理&#xff08;Procedure Texture&#…

java线程生命周期介绍

Java线程的生命周期包含以下几个状态&#xff1a; 1.新建(New)&#xff1a;线程对象被创建&#xff0c;但是还没有调用start()方法。 1.运行(Runnable)&#xff1a;线程正在运行或者是就绪状态&#xff0c;等待CPU时间片。 1.阻塞(Blocked)&#xff1a;线程暂时停止执行&…