排序八卦炉之总复习

news2025/4/8 14:24:27

文章目录

  • 1.总代码
    • 1.1Stack.h
    • 1.2Stack.c
    • 1.3Sort.h
    • 1.4Sort.c
    • 1.5Test.c
  • 2.总结

1.总代码

点击 排序(C) 跳转码云获取完整代码

1.1Stack.h

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

//静态栈
/*
#define N 10
typedef int STDataType;
typedef struct Stack
{
	STDataType a[N];
	int top;
}ST;
*/

typedef int STDataType;
typedef struct Stack
{
	int top;      //栈顶位置
	int capacity;
	STDataType* a;
}ST;

//初始化
void StackInit(ST* ps);

//销毁
void StackDestroy(ST* ps);

//压栈
void StackPush(ST* ps, STDataType x);

//出栈
void StackPop(ST* ps);

//栈顶数据
STDataType StackTop(ST* ps);

//判空
bool StackEmpty(ST* ps);

//栈大小
int StackSize(ST* ps);



1.2Stack.c

#include "Stack.h"

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

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

//压栈
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity = newCapacity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}

//取栈顶
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->a[ps->top - 1];
}

//判空
bool StackEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}

//栈大小
int StackSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

1.3Sort.h

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

//打印函数
void PrintArray(int* a, int n);

//插入排序
void InsertSort(int* a, int n);

//希尔排序
void ShellSort(int* a, int n);

//选择排序
void SelectSort(int* a, int n);

//堆排序
void HeapSort(int* a, int n);

//冒泡排序
void BubbleSort(int* a, int n);

//快速排序
extern int count;        //测试快排递归次数
void QuickSort(int* a, int begin, int end);
void QuickSort_NonRecursion(int* a, int begin, int end);

//归并排序
void MergeSort(int* a, int n);
void MergeSort_NonRecursion1(int* a, int n);
void MergeSort_NonRecursion2(int* a, int n);

//计数排序
void CountSort(int* a, int n);


1.4Sort.c

#include"sort.h"
#include"Stack.h"


//打印函数
void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

//插入排序1.0
/*
void InsertSort(int* a, int n)
{
	//i: 0 -- 倒数第2个元素
	for (int k = 0; k < n - 1; ++k)
	{
		//end记录i
		int end = k;
		//tmp记录end后一个值
		int tmp = a[end + 1];
		//把tmp与tmp前的每一个数比较 若小于则前面数据后移
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		//遇到<=tmp的数 或 tmp前数据遍历完毕 循环终止 把tmp放到目的地
		a[end + 1] = tmp;
	}
}
*/

//插入排序2.0--在这个版本中默认第一个已排好序 在内层for中会与i前的比较 
//直接插入排序没什么问题 但是在下面的希尔排序 第一个元素不能被默认为已经有序
//所以插入排序3.0更好一些 对下面的代码复用起到很好的作用
/*
void InsertSort(int* a, int n)
{
	int k, k, t;
	for (k = 1; k < n; k++)  //i:1 ~ n-1 a[0]默认已排好序
	{
		//临时变量t记录a[k]的值  下面程序a[k]会被修改
		t = a[k];
		//遍历i前所有数据 把比a[k]大的都向后移
		for (k = k - 1; k >= 0 && t < a[k]; k--)
			a[k + 1] = a[k];
		//j的初值为i-1  k!=k-1:i前有比a[k]大的 a[k]移到a[k+1]
		//此时内层for循环已终止 表明i前数据已有序 需要把原a[k]插到合适位置
		if (k != k - 1)
			a[k + 1] = t;
	}
}
*/

//插入排序3.0
void InsertSort(int* a, int n)
{
	int i, j, t;
	for (i = 0; i < n - 1; i++)
	{
		t = a[i + 1];
		for (j = i; j >= 0 && t < a[j]; j--)
			a[j + 1] = a[j];
		if (j != i)
			a[j + 1] = t;
	}
}

//希尔排序1.0
/*
void ShellSort(int* a, int n)
{
	int x = 3;

	for (int k = 0; k < x; ++k)
	{
		for (int k = k; k < n - x; k += x)
		{
			int end = k;
			int tmp = a[end + x];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + x] = a[end];
					end -= x;
				}
				else
				{
					break;
				}
			}
			a[end + x] = tmp;
		}
	}
    PrintArray(a, n);
}
*/
//希尔排序2.0
/*
void ShellSort(int* a, int n)
{
	int x = n;
	while (x > 1)
	{
		x = x / 3 + 1;

		for (int k = 0; k < n - x; ++k)
		{
			int end = k;
			int tmp = a[end + x];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + x] = a[end];
					end -= x;
				}
				else
				{
					break;
				}
			}
			a[end + x] = tmp;
		}

		printf("x:%d->", x);
		PrintArray(a, n);
	}
}
*/

//希尔排序3.0
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		int i, j, t;
		//printf("x:%d->", x);
		//PrintArray(a, n);
		for (i = 0; i < n - gap ; ++i)
		{
			t = a[i + gap];
			for (j = i ; j >= 0 && t < a[j]; j-=gap)
			{
				a[j + gap] = a[j];
			}
			if (j != i)
				a[j + gap] = t;
		}
		//printf("x:%d->", x);
		//PrintArray(a, n);
		//printf("\n");
	}
}

void Swap(int* a, int* b)
{
	if (*a == *b)
		return;
	else
	{
		int t = *a;
		*a = *b;
		*b = t;
	}
}

//插入排序: O(num)~O(num^2)
//选择排序:O(num^2)~O(num^2)
//当数据趋于有序或随机(可能部分有序) 插排更优
void SelectSort(int* a, int n)
{
	assert(a);
	//i:数据头 j:数据尾
	for (int i = 0, j = n - 1; i < j; ++i, --j)
	{
		//假设最大值/最小值下标为i
		int m = i, M = i;
		//遍历i后到j的所有数据 确定real_m/M
		for (int k = i + 1; k <= j; ++k)
		{
			if (a[k] < a[m])
				m = k;

			if (a[k] > a[M])
				M = k;
		}
		//小值换到数据头
		Swap(&a[i], &a[m]);
		//特殊情况需重新匹配
		if (i == M)
		{
			M = m;
		}
		//大值换到数据尾
		Swap(&a[j], &a[M]);
	}
}

//堆排序 -- 升序建大堆 降序建小堆
void AdjustDwon(int* a, int size, int parent)
{
	//设左孩子较小
	int child = parent * 2 + 1;
	//当未达到堆末 进入循环
	while (child < size)
	{
		//确定real小孩子
		//if (child + 1 < size && a[child + 1] < a[child])  //小堆
		
		//确定real大孩子
		if (child + 1 < size && a[child + 1] > a[child])    //大堆
		{
			++child;
		}
		
		//if (a[parent] > a[child])    //小堆
		if (a[parent] < a[child])      //大堆
		{
			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)
	{
		AdjustDwon(a, n, i);
	}
	//排序
	int end = n - 1;           //此时end表示堆尾数据的下标
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDwon(a, end, 0); //此时end表示传过去数据个数(n-1)
		--end;
	}
}

//插入排序  O(num)~O(num^2)
//冒泡排序  O(num)~O(num^2)
//当数据有序 二者均为O(num)
//当数据接近有序或局部有序 插排更优
void BubbleSort(int* a, int n)
{
	assert(a);
	int flag = 1;
	for (int i = 0; flag && i < n - 1; ++i)
	{
		flag = 0;
		for (int j = 0; j < n - 1 - i; ++j)
		{
			if (a[j] > a[j + 1])
			{
				Swap(&a[j + 1], &a[j]);
				flag = 1;
			}
		}
	}
}

//快速排序   O(num * logN)
int count = 0;  //测试递归次数
//对任意区间三值取中位数
int GetMid_X(int* a, int begin, int end)
{
	int mid = (begin + end) / 2;

	if (a[begin] < a[mid])
	{
		if (a[mid] < a[end])
			return mid;
		else if (a[begin] < a[end])
			return end;
		else
			return begin;
	}
	else //a[begin] >= a[mid]
	{
		if (a[mid] > a[end])
			return mid;
		else if (a[begin] < a[end])
			return begin;
		else
			return end;
	}
}
//霍尔版本
int PartQuickSort1(int* a, int begin, int end)
{
	int left = begin, right = end, x = left;

	//确定更合适的key
	int mid_x = GetMid_X(a, begin, end);
	Swap(&a[x], &a[mid_x]);

	while (left < right)
	{
		//右找小
		while (left < right && a[right] >= a[x])
			--right;

		//左找大
		while (left < right && a[left] <= a[x])
			++left;

		Swap(&a[left], &a[right]);
	}

	Swap(&a[x], &a[left]);
	x = left;

	return x;
}
//挖坑版本
int PartQuickSort2(int* a, int begin, int end)
{
	int x = begin;
	
	//确定更合适的key
	int mid_x = GetMid_X(a, begin, end);
	Swap(&a[x], &a[mid_x]); 
	int key = a[x];
    
	while (begin < end)
	{
		while (begin < end && a[end] >= key)
			--end;
		a[x] = a[end];
		x = end;


		while (begin < end && a[begin] <= key)
			++begin;
		a[x] = a[begin];
		x = begin;
	}

	a[x] = key;
	return x;
}  
//指针版本
int PartQuickSort3(int* a, int begin, int end)
{   //prv:previous  cp:current pointer
	int prv = begin, cp = begin + 1, x = begin;
	//确定更合适的key
	int mid_x = GetMid_X(a, begin, end);
	Swap(&a[x], &a[mid_x]);
	while (cp <= end)
	{
		if (a[cp] < a[x] && ++prv != cp)
			Swap(&a[prv], &a[cp]);
		++cp;
	}
	Swap(&a[prv], &a[x]);
	x = prv;
	return x;
}

void QuickSort(int* a, int begin, int end)
{
	count++;
	//begin:左区间左边界下标 
	//end  :右区间右边界下标
	//begin==end:数据量=1 无需排序 直接返回
	//begin>end :无效区间 无需排序 直接返回
	if (begin >= end)
		return;

	int x = PartQuickSort3(a, begin, end);

	// [begin, x - 1] x [x + 1, end]
	QuickSort(a, begin, x - 1);
	QuickSort(a, x+1, end);
}

/*
void QuickSort(int* a, int begin, int end)
{
	arr++;
	if (begin >= end)
		return;
	
	if (end - begin > 10)
	{
		int x = PartQuickSort3(a, begin, end);
		
		// [begin, x-1] x [x+1, end]
		QuickSort(a, begin, x - 1);
		QuickSort(a, x + 1, end);
	}
	else 
		InsertSort(a + begin, end - begin + 1);
}
*/
//非递归版本
void QuickSort_NonRecursion(int* a, int begin, int end)
{
	ST st;
	StackInit(&st);

	StackPush(&st, begin);
	StackPush(&st, end);

	while (!StackEmpty(&st))
	{
		int end = StackTop(&st);
		StackPop(&st);
		int begin = StackTop(&st);
		StackPop(&st);

		int x = PartQuickSort3(a, begin, end);
		 
		if (x + 1 < end)
		{
			StackPush(&st, x + 1);
			StackPush(&st, end);
		}
		// [begin, x-1] x [x+1, end]
		if (begin < x - 1)
		{
			StackPush(&st, begin);
			StackPush(&st, x - 1);
		}
	}
	StackDestroy(&st);
}

//归并排序 时间复杂度:O(num*logN)   空间复杂度:O(num)
void PartMergeSort(int* a, int begin, int end, int* tmp)
{
	if (begin >= end)
		return;

	int mid = (begin + end) / 2;

	//[begin, mid] [mid+1, end] 
	PartMergeSort(a, begin, mid, tmp);
	PartMergeSort(a, mid + 1, end, tmp);

	//[begin, mid] [mid+1, end]
	//  [index, mid]     [k, end]
	int i = begin, j = mid + 1, k = i;
	while (i <= mid && j <= end)
	{
		if (a[i] <= a[j])
			tmp[k++] = a[i++];
		else
			tmp[k++] = a[j++];
	}

	while (i <= mid)
		tmp[k++] = a[i++];
	while (j <= end)
		tmp[k++] = a[j++]; 
	
	memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));
}
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	//void PartMergeSort(int* a, int begin, int end, int* tmp);
	PartMergeSort(a, 0, n - 1, tmp);
	free(tmp);
}
void MergeSort_NonRecursion1(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}

	int range = 1;
	while (range < n)
	{
		printf("num = %d ->", range);
		for (int index = 0; index < n; index += 2 * range)
		{
			int i = index, k = i,  end = index + range - 1;
			int j = index + range, End = index + 2 * range - 1;
			
			//修正边界
			if (end >= n)
			{
				end = n - 1;
				j = n;
				End = n - 1;
			}
			else if (j >= n)
			{
				j = n;
				End = n - 1;
			}
			else if (End >= n)
				End = n - 1;
			printf("[%d,%d]--[%d, %d]  ", i, end, j, End);
			//数据排序
			while (i <= end && j <= End)
			{
				if (a[i] <= a[j])
					tmp[k++] = a[i++];
				else
					tmp[k++] = a[j++];
			}
			while (i <= end)
				tmp[k++] = a[i++];
			while (j <= End)
				tmp[k++] = a[j++];
		}
		printf("\n");
		memcpy(a, tmp, sizeof(int) * n);
		range *= 2;
	}

	free(tmp);
}
void MergeSort_NonRecursion2(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}

	int range = 1;
	while (range < n)
	{
		printf("num=%d->", range);
		for (int index = 0; index < n; index += 2 * range)
		{
			int i = index, k = i, end = index + range - 1;
			int j = index + range, End = index + 2 * range - 1;
            if (end >= n || j >= n)
				break;
			else if (End >= n)
				End = n - 1;
			printf("[%d,%d]--[%d,%d]  ", i, end, j, End);
			int m = End - i + 1;
			while (i <= end && j <= End)
			{
				if (a[i] <= a[j])
					tmp[k++] = a[i++];
				else
					tmp[k++] = a[j++];
			}
            while (i <= end)
				tmp[k++] = a[i++];
			while (j <= End)
				tmp[k++] = a[j++];
			memcpy(a + index, tmp + index, sizeof(int) * m);
		}
		printf("\n");
		range *= 2;
	}
	free(tmp);
}

//计数排序  时间复杂度:O(max(num, N)) 空间复杂度:O(num)
void CountSort(int* a, int n)
{
	//确定最值
	int min = a[0], max = a[0];
	for (int i = 1; i < n; ++i)
	{
		if (a[i] < min)
			min = a[i];
		if (a[i] > max)
			max = a[i];
	}
	int num = max - min + 1;  //最多有N个"连续"的数据
	//开空间
	int* arr = (int*)malloc(sizeof(int) * num);
	if (arr == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	memset(arr, 0, sizeof(int) * num);

	//a的数据映射到arr的下标 arr的值存储对应数据出现次数
	for (int i = 0; i < n; ++i)
		arr[a[i] - min]++;
	for (int i = 0, j = 0; i < num; ++i)
	{
		while (arr[i]--)
			a[j++] = i + min;
	}
}

1.5Test.c

#include "Sort.h"

//插入排序
void TestInsertSort()
{ 
	int a[] = { 4, 9,5, 2, 6, 3, 8, 5, 1, 7, 10 };
	InsertSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

//希尔排序
void TestShellSort()
{
	int a[] = { 4, 9, 2, 6, 3, 8, 5, 1, 7, 10 };
	ShellSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

//选择排序
void TestSelectSort()
{
	int a[] = { 4, 9, 2, 6, 3, 8, 5, 1, 7 };
	SelectSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

//冒泡排序
void TestBubbleSort()
{
	int a[] = { 4, 9, 2, 6, 3, 8, 5, 1, 7 };
	BubbleSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

//快速排序
void TestQuickSort()
{
	int a[] = { 4, 9, 2, 6, 3, 8, 5, 1, 7, 10 };
	//QuickSort(a, 0, sizeof(a) / sizeof(int)-1);
	QuickSort_NonRecursion(a, 0, sizeof(a) / sizeof(int) - 1);

	PrintArray(a, sizeof(a) / sizeof(int));
}

//归并排序
void TestMergeSort()
{
	int a[] = { 4, 2, 6, 3, 8, 5, 1, 7, 9 };
	printf("%u个数据\n", sizeof(a) / sizeof(int));
	//MergeSort(a, sizeof(a) / sizeof(int));
	//MergeSort_NonRecursion1(a, sizeof(a) / sizeof(int));
	MergeSort_NonRecursion2(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

//计数排序
void TestCountSort()
{
	int a[] = { -2,-4,-2,4,6,1,3,8,6,9,3 };
	CountSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

//性能测试
void TestOP()
{
	srand(time(0));
	const int N = 1000000;
	int* a1 = (int*)malloc(sizeof(int) * N);
	int* a2 = (int*)malloc(sizeof(int) * N);
	int* a3 = (int*)malloc(sizeof(int) * N);
	int* a4 = (int*)malloc(sizeof(int) * N);
	int* a5 = (int*)malloc(sizeof(int) * N);
	int* a6 = (int*)malloc(sizeof(int) * N);
	int* a7 = (int*)malloc(sizeof(int) * N);


	for (int i = 0; i < N; ++i)
	{
		a1[i] = rand();
		a2[i] = a1[i];
		a3[i] = a1[i];
		a4[i] = a1[i];
		a5[i] = a1[i];
		a6[i] = a1[i];
		a7[i] = a1[i];
	}

	//ShellSort(a1, N);

	int begin1 = clock();
	//InsertSort(a1, N);
	int end1 = clock();

	int begin2 = clock();
	//ShellSort(a3, N);
	int end2 = clock();

	int begin3 = clock();
	//SelectSort(a3, N);
	int end3 = clock();

	int begin4 = clock();
	//HeapSort(a4, N);
	int end4 = clock();

	int begin5 = clock();
	QuickSort(a5, 0, N - 1);
	int end5 = clock();

	int begin6 = clock();
	//MergeSort(a6, N);
	int end6 = clock();

	int begin7 = clock();
	//BubbleSort(a7, N);
	int end7 = clock();

	printf("InsertSort:%d\n", end1 - begin1);
	printf("ShellSort:%d\n", end2 - begin2);
	printf("SelectSort:%d\n", end3 - begin3);
	printf("HeapSort:%d\n", end4 - begin4);
	printf("QuickSort:%d\n", end5 - begin5);  printf("count:%d\n", count);
	printf("MergeSort:%d\n", end6 - begin6);
	printf("BubbleSort:%d\n", end7 - begin7);

	

	free(a1);
	free(a2);
	free(a3);
	free(a4);
	free(a5);
	free(a6);
	free(a7);
}

int main()
{
	//插入排序
	TestInsertSort();
	
	//希尔排序
	//TestShellSort();
	
	//选择排序
	//TestSelectSort();
	
	//堆排序
	//TestHeapSort();
	
	//冒泡排序
	//TestBubbleSort();
	
	//快速排序
	//TestQuickSort();
	
	//归并排序
	//TestMergeSort();
	
	//计数排序
	//TestCountSort();

	//性能测试
	//TestOP();

	return 0;
}

2.总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

web前端html

文章目录 快捷方式一、html5的声明二、html5基本骨架 2.1 html标签 2.2 head标签 2.3 body和head同级 2.4 body标签 2.5 title标签 2.6 meta标签 三、标题标签介绍与应用 3.1 标题的介绍 3.2 标题标签位置摆放 3.3 标签之段落、换行、水平线 3.3 标签之图片 3.3.1 图…

【快应用】list组件如何区分滑动的方向?

【关键词】 list组件、滑动方向、scroll 【问题背景】 有cp反馈list这个组件在使用的时候&#xff0c;不知道如何区分它是上滑还是下滑。 【问题分析】 list组件除了通用事件之外&#xff0c;还提供了scroll、scrollbottom、scrolltop、scrollend、scrolltouchup事件&#x…

Spark官方调优三部曲之三:其它优化思路

前言 前面介绍了关于spark性能调优两个最重要的点: 数据序列化内存调优这两个方向都进行调优后,如果想进一步继续优化你的程序,可以参考下面的思路。 设置合理的并行度 除非将每个操作的并行级别设置得足够高,否则集群资源不会得到充分利用。Spark根据每个文件的大小自动…

【5G NR】逻辑信道、传输信道和物理信道的映射关系

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

微信开发之朋友圈自动点赞的技术实现

简要描述&#xff1a; 朋友圈点赞 请求URL&#xff1a; http://域名地址/snsPraise 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId…

WSL安装

WSL安装 1.Microsoft store 安装 1.1 启动WSL功能 在【程序和功能 -> 启用或关闭 Windows 功能】中勾选【适用于 Linux 的 Windows 子系统】 1.2 Store中下载安装 在 Microsoft Store 中下载并安装需要的 Linux 发行版 2.不使用Store安装WSL 注&#xff1a;1.1也要…

Nios初体验之——Hello world!

文章目录 前言一、系统设计1、系统模块框图2、系统涉及到的模块1、时钟2、nios2_qsys3、片内存储&#xff08;onchip_rom、onchip_ram&#xff09;4、串行通信&#xff08;jtag_uart&#xff09;5、System ID&#xff08;sysid_qsys&#xff09; 二、硬件设计1、创建Qsys2、重命…

vue中vue-lazyload报错

1.问题&#xff1a; 说明&#xff1a;也就是版本不兼容&#xff0c;我安装的是vue2,因此需要 "vue-lazyload": "^1.2.6"或者更低 2.解决 npm i vue-lazyload1.2.6

第二季“数字强市建设体验团”活动感悟-张继群

目录 第二季“数字强市建设体验团”活动感悟-张继群 第二季“数字强市建设体验团”活动感悟-张继群 此次参观中山东安信木业、费县智慧城市运营中心、澳柯玛以及沂南双创科技园区给我留下深刻印象&#xff0c;我深深地感受到了现代科技与生活的紧密联系。我们临沂市智慧大数据…

js-3:DOM常见的操作有哪些?

1、DOM 文档对象模型&#xff08;DOM&#xff09;是HTML和XML文档的编程接口。 它提供了对文档的结构化的表述&#xff0c;并定义了一种方式&#xff0c;可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式跟内容。 任何HTML和XML文档都可以用DOM表…

自然语言处理学习笔记(五)————切分算法

目录 1.切分算法 2.完全切分 3.正向最长匹配 4.逆向最长匹配 5.双向最长匹配 6.速度评测 1.切分算法 词典确定后&#xff0c;句子可能含有很多词典中的词语&#xff0c;他们有可能互相重叠&#xff0c;如何切分需要一些规则。常用规则为&#xff1a;正向匹配算法、逆向匹…

opencv基础44- Canny边缘检测详解-cv.Canny()

什么是Canny边缘检测&#xff1f; Canny边缘检测是一种经典的边缘检测算法&#xff0c;由John F. Canny在1986年提出。它被广泛应用于计算机视觉和图像处理领域&#xff0c;是一种多阶段的边缘检测算法&#xff0c;能够有效地检测图像中的边缘并抑制噪声。 Canny边缘检测的主要…

APP外包开发的学习流程

学习iOS App的开发是一项有趣和富有挑战性的任务&#xff0c;是一个不断学习和不断进步的过程。掌握基础知识后&#xff0c;不断实践和尝试新的项目将使您的技能不断提升。下面和大家分享一些建议&#xff0c;可以帮助您开始学习iOS App的开发。北京木奇移动技术有限公司&#…

Redis 拒绝服务漏洞(CVE-2023-28856)修复处理

一、漏洞描述 Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值&#xff08;Key-Value&#xff09;存储数据库&#xff0c;并提供多种语言的API。 Redis 7.0.0 到 7.0.10版本、6.2.0 到 6.2.11版本、6.0.0 到 …

【Linux】【预】配置网络IP,挂载网络目录

【Linux】【预】配置网络IP&#xff0c;挂载网络目录 1. 配置查看IP2.配置Linux中的IP3. 串口连接开发板&#xff0c;配置 1. 配置查看IP a . 查看ipifconfig如下操作&#xff0c;其中的&#xff1a;192.168.252.140就是它的IP b . 使用xmodem 连接到虚拟机&#xff0c;最后点…

P1396 营救(最小生成树)(内附封面)

营救 题目背景 “咚咚咚……”“查水表&#xff01;”原来是查水表来了&#xff0c;现在哪里找这么热心上门的查表员啊&#xff01;小明感动得热泪盈眶&#xff0c;开起了门…… 题目描述 妈妈下班回家&#xff0c;街坊邻居说小明被一群陌生人强行押上了警车&#xff01;妈…

2. Linux安装Git

yum安装 查看版本 版本太低&#xff0c;所以我们采用自己上传编译的方式进行 删除已安装的git yum remove git 下载最新安装包&#xff0c;并上传到服务器文件夹下 上传&#xff0c;解压 5.安装编译需要的依赖 yum install curl-devel expat-devel gettext-devel openssl-…

【Leetcode】无重复字符的最长字串||带输出测试(滑动窗口+HashMap)

step by step. 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出…

UE4 Cesium for unreal 离线加载应用全流程

参考配置&#xff1a;Win10、请保证是在局域网环境下配置 配置IP 右键选择&#xff1a;打开“网络和Internet” 设置 选择更改适配器选项 请保证以太网是处于启用状态并连接线缆&#xff0c;点击右键选择属性 双击选择Internet协议版本4&#xff08;TCP/IPv4&#xff09; 将IP地…

Git从远程仓库中删除文件,并上传新文件

目录 删除&#xff1a; 拉取远程分支的更新&#xff1a; ​编辑 首先查看git状态&#xff1a; ​编辑 删除文件并提交版本库&#xff1a; 提交&#xff1a; 上传新文件&#xff1a; 首先查看git状态&#xff1a; 提交到暂存区&#xff1a; 提交到版本库&#xff1a; 上…