十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)

news2024/11/17 21:23:12

目录

一、冒泡排序:

二、插入排序:

三、选择排序:

四、希尔排序:

五、堆排序:

六、快速排序:

6.1挖坑法:

6.2左右指针法

6.3前后指针法:

七、归并排序:

八、桶排序:

九、计数排序:

9.1绝对映射:

9.2现对映射:

十、基数排序: 


一、冒泡排序:

1、思路:通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现前一个数大于后一个数则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。

2、先以一个数组讲解一下,然后再写代码:
      待排序数组:3,9,-1,10,20
       第一轮排序:
        (1)3,9,-1,10,20      ----3跟9比较,不交换

        (2)3,-1,9,10,20      ----9比 -1大,所以9跟 -1交换

        (3)3,-1,9,10,20      ----9跟10比较,不交换

        (4)3,-1,9,10,20      ----10跟20比较,不交换

           第一轮过后,将20这个最大的元素固定到了最后的位置。

           在第二轮的时候20不参与冒泡。

       第二轮排序:
            因为20的位置已经固定,所以只对前4个进行排序即可:

        (1)-1,3,9,10,20      ----3比 -1大,进行交换

        (2)-1,3,9,10,20      ----3跟9比较,不交换

        (3)-1,3,9,10,20      ----9跟10比较,不交换

            第二轮过后,将第二大的元素固定到了倒数第二个位置

       第三轮排序:
            10和20的位置已经确定,只需对前三个进行排序

        (1)-1,3,9,10,20      ----3和-1比较,不交换

        (2)-1,3,9,10,20      ----3和9比较,不交换

            第三轮过后,将第三大的元素位置确定

       第四轮排序:
            只对前两个元素进行排序

        (1)-1,3,9,10,20      ----3和-1比较,不交换

       第四轮过后,将第四大的元素位置确定,此时总共5个元素,已经排序好4个,从而最后一个自然而然就是排好序的了

小结:
设总的元素个数为n,那么由上边的排序过程可以看出:

(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环

(2)每轮排序比较的次数逐轮减少

(3)如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序

(4)时间复杂度是O(N^2)      在有序的时候,很快,因为有exchange变量优化了代码

         在乱序的时候很慢很慢。

#include<stdio.h>
void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
//冒泡排序
void BubbleSort(int* a, int n)
{
	int end = n - 1;//不能是n,不然会越界
	while(end)
	{
		int exchange = 0;//优化,比较之后没有交换,说明已经排好了,就break循环
		for (int i = 0; i < end; i++)
		{
			if (a[i] < a[i + 1])
			{
				swap(&a[i], &a[i + 1]);
				exchange++;
			}
		}
		if (exchange == 0) break;
		end--;
	}
}


二、插入排序:

1、思路:

        在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
  但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中来,直到整个序列有序为止。

2、举例:

        如下图的插入扑克牌,当摸到7的时候,会不自觉的与前面的数比较,如果比7大,把大的数向后挪动(swap),然后在第一个小于7的后面插入7

 

//插入排序
void InsertSort(int* a, int n)
{
	for (int i = 1; i < n; i++)
	{
		if (a[i] < a[i - 1])//先判断,如果i下标的值大于前面的数,就不进入
		{
			int tmp = a[i];
			int j;
			for (j = i - 1; j >= 0 && a[j] >tmp; j--)
			{
				a[j+1] = a[j];
			}
			a[j+1] = tmp;
		}
	}
}
//两次循环就可以实现
//内部循环完成一趟的插入
//外层循环完成插入排序

三、选择排序:

思路:

1.内层循环一趟找出最小值的下标,与第一个数交换。重复找小,交换的两个操作。
2.实际上,我们可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。

但时间复杂度还是O(N^2),效率还是不高

//选择排序
void SelectSort(int* a, int n)
{
	for (int i = 0; i < n-1; i++)//i<n-1当它是最后一个数的时候不需要进行交换排序
	{
		int min = i;
		int j;
		for (j = i; j < n; j++)
		{
			if (a[j] < a[min])
			{
				min=j;
			}
		}
		swap(&a[i], &a[min]);//交换函数,前面的代码中有出现,我就不重复写了
	}
}

四、希尔排序:

思路:

1.插入排序的优化版,有一个预排序的过程。让大的数快速的跳到后面,小的数快速的跳到前面。

2.使待排序列接近有序,然后再对该序列进行一次插入排序。

3.相当于把直接插入排序中的1换成gap而已。 

//希尔排序
/*步骤:
1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再gap--,重复上述操作。
2.当gap==1时就是直接插入排序,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。*/

void ShellSort(int* a, int n)
{
	//这里相当于把插入排序的1换成gap
	int gap = n;
	while (gap>1)
	{
		gap = gap / 3 + 1;
		for (int i = gap; i < n; i++)
		{
			if (a[i] < a[i - gap])
			{
				int tmp = a[i];
				int j;
				for (j = i - gap; j >= 0 && a[j] > tmp; j-=gap)//这里是j-=gap
				{
					a[j + gap] = a[j];
				}
				a[j + gap] = tmp;
			}
		}
	}
}

五、堆排序:

先来认识堆:

   1.什么是堆?

          大堆:父亲大于儿子          小堆:父亲小于儿子(父亲,儿子是二叉树的概念)

   2.堆的物理结构和逻辑结构?

          物理结构:数组         逻辑结构:完全二叉树

堆排序包括建堆(向下调整+循环)  堆排序(交换+向下调整)

  1.建堆:

        要建大堆,堆顶的元素和最后一个数交换,然后把size--,就不会破坏堆的结构

  2.向下调整算法:

        比较两个孩子的大小,选出大的孩子,与父亲比较,如果孩子大于父亲,交换。然后把parent=child,child=parent*2+1;向下调整算法一共会调整h-1次

//向下调整算法(要满足它下面的都满足堆,才能用)
void AdjustDown(int* a, int n, int root)
{
	int parent = root;
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child + 1 < n && a[child] < a[child + 1]) child+=1;//把他移到右孩子那里
		if (a[child] > a[parent])
		{
			swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else break;
	}
}

堆排序
void HeapSort(int* arr, int n)
{
	//建大堆
    //从最后一个根开始,就相当于它下面的都满足堆,就可以用向下调整算法
	for (int i = (n-1-1)/2; i >= 0; i--)//n-1-1是因为数组的最后一个元素下标是n-1
	{
		AdjustDown(arr, n, i);
	}
	//排序
	for (int i = n; i > 1; i--)
	{
		swap(&arr[0],&arr[i - 1]);
		AdjustDown(arr, i-1, 0);
	}
}

六、快速排序:

三种快排方法:(一定要自己尝试着去写,会有一些坑,自己写才可以体会)

1.挖坑法

2.左右指针法

3.前后指针法


6.1挖坑法:

1.思想:

        记第一个数为key,要调整key的位置,使得左边的都要比key的小,右边的数都比key的大。

2.步骤:

        选出一个数据(一般是最左边或是最右边的)存放在key变量中,在该数据位置形成一个坑
        还是定义一个left和一个right,left从左向右走(当遇到大于key的值时停下来)。right从右向左走(当遇到小于key的值时停下来)。(若在最左边挖坑,则需要right先走;若在最右边挖坑,则需要left先走) 

        把right的那个小的数放在坑中,在把left那个位置的值放在right那个位置中

        重复操作,直到left>right时结束,完成一趟,把key放在了正确的位置

        最后用分治思想,分成左边和右边,递归。

 

//1.挖坑法的快速排序
void QuickSort(int* a,int left,int right)
{
	if (left >= right)//不能写成pivot==left,pivot-1与left不匹配,会报错
	{
		return;
	}
	int begin = left,end = right;
	int key = a[begin];//挖了一个关键字
	int pivot = begin;//挖了一个坑
	while (begin < end)
	{
		//右边找小,一定要先右边找小,放在pivot
		while (begin < end&&a[end] >= key)//在这里也要判断begin < end,因为这里面end--
		{
			end--;
		}
		//小的放在左边的坑里,然后形成新的坑位
		a[pivot] = a[end];
		pivot = end;
		//左边找大
		while (begin < end && a[begin] <= key)
		{
			begin++;
		}
		a[pivot] = a[begin];
		pivot = begin;	
	}
	//begin==end	
	a[pivot] = key;

	//[left,right]
	//[left,pivot-1]  pivot  [pivot+1,right]
	//如果左子区间和右子区间都有序,就全部有序。那就分治递归。
	QuickSort(a, left, pivot - 1);
	QuickSort(a, pivot+1, right);
}

6.2左右指针法

思路:
1、选出一个key,一般是最左边或是最右边的。
2、定义一个begin和一个end,begin从左向右走,end从右向左走。(需要注意的是:若选择最左边的数据作为key,则需要end先走;若选择最右边的数据作为key,则需要bengin先走)(考虑到最后的时候相遇点的和key交换)。
3、在走的过程中,若end遇到小于key的数,则停下,begin开始走,直到begin遇到一个大于key的数时,将begin和right的内容交换,end再次开始走,如此进行下去,直到begin和end最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)
4.此时key的左边都是小于key的数,key的右边都是大于key的数
5.将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时

void QuickSort(int* a, int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int begin = left, end = right;
	int key = begin;//这里与挖坑法不同的地方,因为要交换key的那个数组中那个位置的数,而不是值
	while (begin < end)
	{
		while (begin < end && a[end] >= a[key])
		{
			end--;
		}
		while (begin < end && a[begin] <= a[key])
		{
			begin++;
		}
		Swap(&a[begin], &a[end]);
	}
	Swap(&a[begin], &a[key]);
	QuickSort(a, left, begin - 1);
	QuickSort(a, begin + 1, right);
}

6.3前后指针法:

思路:
1、选出一个key,一般是最左边。
2、起始时,prev指针指向序列开头,cur指针指向prev+1。
3、让cur一直向前走,当遇到小于a[key]时,让prev向前走一格(这个值一定大于a[key],因为是cur走过的),然后a[cur]和a[prev]交换。

经过一次单趟排序,最终也能使得key左边的数据全部都小于key,key右边的数据全部都大于key。

然后也还是将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去

用if(left>right)

{
        reurn;

}//跳出递归

void QuickSort(int* a, int left,int right)
{
	if (left >= right)
	{
		return;
	}
	int index=GetMidIndex(a,left, right);
	swap(&a[left], &a[index]);
	int key = left;
	int prev = left;
	int cur = left+1;
	while (cur <= right)
	{
		if (a[cur] < a[key])
		{
			prev++;
			swap(&a[cur], &a[prev]);
		}
		/*可以简写成cur++,   
		但是当时一定要注意不要放在if语句的前面,因为if语句里面有让cur与prev交换的,cur==right跳出循环,但是a[cur]超过数组的范围,会越界范围。
        while (cur<=right&&a[cur] >= a[key])   
		{
			cur++;
		}*/
        cur++;
	}
	swap(&a[prev], &a[key]);
	QuickSort(a, left, prev - 1);
	QuickSort(a, prev+1,right);
}

 6.4优化快排

三数取中法:取左端、中间、右端三个数,然后进行比较,将中值数当做key

否则有序时时间复杂度为O(N^2)

三数取中法可以套入三种方法中,这里我就写一种

//三数取中
int GetMidIndex(int* a, int left, int right)
{
	int mid = (left + right) / 2;
	if (a[mid] >= a[left])
	{
		if (a[mid] <= a[right])
		{
			return mid;
		}
		else
		{
			if (a[right] >= a[left])
			{
				return right;
			}
			else
			{
				return left;
			}
		}
	}
	else//a[left]>a[mid]
	{
		if (a[right] >= a[left])
		{
			return left;
		}
		else
		{
			if (a[right] >= a[mid])
			{
				return right;
			}
			else
			{
				return mid;
			}
		}
	}
}

//交换
void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

//前后指针法
void QuickSort(int* a, int left,int right)
{
	if (left >= right)
	{
		return;
	}
	int index=GetMidIndex(a,left, right);
	swap(&a[left], &a[index]);
	int key = left;
	int prev = left;
	int cur = left+1;
	while (cur <= right)
	{
		if (a[cur] < a[key])
		{
			prev++;
			swap(&a[cur], &a[prev]);
		}
		cur++;
	}
	swap(&a[prev], &a[key]);
	QuickSort(a, left, prev - 1);
	QuickSort(a, prev+1,right);
}

七、归并排序:

思路:

1.不断的分割数据,让数据的每一段都有序(一个数据相当于有序)

2.当所有子序列有序的时候,在把子序列归并,形成更大的子序列,最终整个数组有序。

 !!!需要开一个_MergeSort,而不是直接在MergeSort中直接递归,是因为MergeSort中有一个malloc

归并排序很像二叉树中的后序思想,先递归,递归到最后的时候再合并。!!!

//归并排序
void _MergeSort(int* a, int left, int right, int* tmp)//在这个函数中调用递归{
	if (left >= right)
	{
		return;
	}
	int mid = (left + right) >> 1;
	_MergeSort(a, left, mid, tmp);
	_MergeSort(a, mid+1, right, tmp);
	//合并
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int i = left;
	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++];
	}
	for (int j = left; j <= right; j++)
	{
		a[j] = tmp[j];
	}
}
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	_MergeSort(a, 0, n - 1, tmp);
	free(tmp);
}

八、桶排序:

思路:大问题化小

桶排序 (Bucket sort)或所谓的箱排序,是一种分块的排序算法,工作的原理是将数组分到有限数量的桶里,每个桶的大小都相等。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)

把待排序序列(数组)中的数据根据函数映射方法分配到若干个桶中,在分别对各个桶进行排序,最后依次按顺序取出桶中的数据。
适用于数据分配均匀,数据比较大,相对集中的情况。

//桶排序
void bucket_sort(int a[],int size,int bucket_size) {
	int i,j;        //数组,数组长度,桶的大小
 
                        //定义动态的指针数组
	KeyNode **bucket_num = (KeyNode **)malloc(bucket_size * sizeof(KeyNode*));
 
	for(i = 0;i < bucket_size;i++) 
	{
		bucket_num[i] = (KeyNode*)malloc(sizeof(KeyNode));//为每个链表定义头结点 
		bucket_num[i]->num = 0;   
		bucket_num[i]->next = NULL;   //指针变量初始化为空
	}
 
	for(j = 0;j < size;j++) //准备插入
	{
		KeyNode *node = (KeyNode *)malloc(sizeof(KeyNode));//定义一个节点 
		node->num = a[j];    //数据域存数据 
		node->next = NULL;	//指向空
		
		int index = a[j]/100;  //映射函数 计算桶号
		
		KeyNode *p = bucket_num[index];//p指向链表的头
       
        //链表结构的插入排序
		while(p->next != NULL && p->next->num <= node->num)
		{
			p = p->next;	//1.链表为空,p->next==NULL,进入不了循环 
		}					//2.链表不为空,因为链表从无开始按顺序插入,数据为有序的,
							//可以找到    前一个节点 <= node <=后一个节点
		
		//节点插入链表 
		node->next = p->next;
		p->next = node;
		(bucket_num[index]->num)++;	//记录一下该链表中有几个有效节点 
 
	}
	//打印结果
	KeyNode * k = NULL;  //定义一个空的结构体指针用于储存输出结果
	for(i = 0;i < bucket_size;i++)
    {
        //for(k = bucket_num[i]->next;k!=NULL;k=k->next)//通过最后一个指针指向空
        k = bucket_num[i]->next;
        for(int m=0;m<bucket_num[i]->num;m++)   //通过头指针记录节点数
        {
            printf("%d ",k->num);
            k=k->next;
        			
    }		
	printf("\n");
}

九、计数排序:

一种特殊的排序,唯一种没有比较的排序(指没有前后比较,还是有交换的)

以数组的下标当做数值,有这个数的时候a[i]++;

 局限:适用于整数。数要求集中(否则空间的浪费大)

9.1绝对映射:

int * countingSort1(int arr[],int count,int max) {
    int index = 0;
    int *tmpArr = (int *)malloc(max*sizeof(int));
    int *result = (int *)malloc(max*sizeof(int));
    
    for(int k = 0;k<max;k++) {
        tmpArr[k] = 0;
    }
    
    for (int i = 0; i<count; i++) {
        tmpArr[arr[i]]++;
    }
    for (int j = 0; j<max; j++) {
        while (tmpArr[j]) {
            result[index++] = j;
            tmpArr[j]--;
        }
    }
    free(tmpArr);
    tmpArr = NULL;
    return result;
}

9.2现对映射:

void CountSort(int* a, int n)
{
	int max = a[0], min = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] > max) max = a[i];
		if (a[i] < min) min = a[i];
	}
	int range = max - min + 1;
	int* count = (int*)malloc(sizeof(int) * range);
	memset(count, 0, sizeof(int) * range);
	for (int i = 0; i < n; i++)
	{
		count[a[i] - min]++;
	}
	int i = 0;
	for (int j = 0; j < range; j++)
	{
		while (count[j]--)
		{
			a[i++] = j + min;
		}
	}
	free(count);
}

十、基数排序: 

原理:是将整数按位数切割成不同的数字,然后按每个位数分别比较。

#include<math.h>
testBS()
{
    inta[] = {2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3};
    int *a_p = a;
    //计算数组长度
    intsize = sizeof(a) / sizeof(int);
    //基数排序
    bucketSort3(a_p, size);
    //打印排序后结果
    inti;
    for(i = 0; i < size; i++)
    {
        printf("%d\n", a[i]);
    }
    intt;
    scanf("%d", t);
}
//基数排序
voidbucketSort3(int *p, intn)
{
    //获取数组中的最大数
    intmaxNum = findMaxNum(p, n);
    //获取最大数的位数,次数也是再分配的次数。
    intloopTimes = getLoopTimes(maxNum);
    inti;
    //对每一位进行桶分配
    for(i = 1; i <= loopTimes; i++)
    {
        sort2(p, n, i);
    }
}
//获取数字的位数
intgetLoopTimes(intnum)
{
    intcount = 1;
    inttemp = num / 10;
    while(temp != 0)
    {
        count++;
        temp = temp / 10;
    }
    returncount;
}
//查询数组中的最大数
intfindMaxNum(int *p, intn)
{
    inti;
    intmax = 0;
    for(i = 0; i < n; i++)
    {
        if(*(p + i) > max)
        {
            max = *(p + i);
        }
    }
    returnmax;
}
//将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
voidsort2(int *p, intn, intloop)
{
    //建立一组桶此处的20是预设的根据实际数情况修改
    intbuckets[10][20] = {};
    //求桶的index的除数
    //如798个位桶index=(798/1)%10=8
    //十位桶index=(798/10)%10=9
    //百位桶index=(798/100)%10=7
    //tempNum为上式中的1、10、100
    inttempNum = (int)pow(10, loop - 1);
    inti, j;
    for(i = 0; i < n; i++)
    {
        introw_index = (*(p + i) / tempNum) % 10;
        for(j = 0; j < 20; j++)
        {
            if(buckets[row_index][j] == NULL)
            {
                buckets[row_index][j] = *(p + i);
                break;
            }
        }
    }
    //将桶中的数,倒回到原有数组中
    intk = 0;
    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < 20; j++)
        {
            if(buckets[i][j] != NULL)
            {
                *(p + k) = buckets[i][j];
                buckets[i][j] = NULL;
                k++;
            }
        }
    }
}

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

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

相关文章

中医把脉笔记

目录 寸关尺对应的五脏六腑自己给自己把脉把脉五布法定寸关尺分浮中沉分快慢辨阴阳看虚实 参考文章 寸关尺对应的五脏六腑 自己给自己把脉 up主道道总是睡不着的把脉教学视频 用中指按住小骨头下面一点&#xff0c;这是关脉&#xff0c;左手的关脉对应肝脏。 把脉五布法 定…

【脚本玩漆黑的魅影】冠军之路全自动练级

文章目录 原理全部代码 原理 没有新东西。 安全区选在了这里&#xff0c;上面是洞口&#xff0c;下面是治疗。 因为逛的区域大了点&#xff0c;这次用跑的。&#xff08;好像之前也能跑&#xff09; def chu_qu(): # 右逛c.press(B)press(UP, 0.4)c.release(B) def hui_qu()…

【Lazy ORM】 小工具 acw 本地客户端 你负责点击页面,他负责输出代码

介绍 wu-smart-acw-client 简称acw-client&#xff0c;是一个基于Lazy ORM定制的客户端代码生成小工具 Lazy ORM 小工具 acw 本地客户端 你负责点击页面&#xff0c;他负责输出代码安装 <dependency><groupId>top.wu2020</groupId><artifactId>wu-sma…

2024年腾讯云99元1年服务器_新老同享_续费99元一年

良心腾讯云推出99元一年服务器&#xff0c;新用户和老用户均可以购买&#xff0c;续费不涨价&#xff0c;续费也是99元&#xff0c;配置为轻量2核2G4M、50GB SSD盘、300GB月流量、4M带宽&#xff1a;优惠价格99元一年&#xff0c;续费99元&#xff0c;官方活动页面 txybk.com/g…

MySQL入门到中级知识汇总2024

文章目录 1.揭开MySQL的神秘面纱2. SQL的基本命令实操3. 数据库的备份与恢复4. MySQL常用的数据类型&#xff08;列类型&#xff09;5. 数据类型之小数类型的使用6. 表的创建7. 表的修改8. mysql事务9. mysql表类型和存储引擎10. mysql的视图11. mysql的管理 1.揭开MySQL的神秘…

OpenHarmony教程指南—性能示例(renderGroup接口)

性能示例 介绍 本示例使用renderGroup接口实现了在单一页面上存在大量应用动效的组件时&#xff0c;使用renderGroup方法来解决卡顿问题&#xff0c;从而提升绘制能力。 renderGroup原理说明&#xff1a;首次绘制组件时&#xff0c;若组件被标记为启用renderGroup状态&#…

考研常识 | 专业硕士与学术硕士的11个区别

专业硕士与学术硕士的11个区别 对于考研学子而言&#xff0c;了解专业学位与学术学位的区别&#xff0c;是报考的第一步。学术学位研究生一般都是全日制的&#xff0c;而专业学位研究生的学习方式还分为即全日制与非全日制两种。这篇文章将带大家认识全日制专业学位与全日制学术…

Visual C++ 2010学习版安装教程

1. 创建项目 点击 “创建新项目”&#xff0c;创建一个项目。 2. 创建 helloworld.c ⽂件 3. 在弹出的编辑框中&#xff0c;选中 “C文件(.cpp)”&#xff0c;将 下方 “源.cpp” 手动改为要新创建的文件名。 如&#xff1a;helloWorld.c 。注意&#xff0c;默认 cpp 后缀名&am…

vue+nodejs超市购物商城在线选品系统wtk87

在此基础上&#xff0c;结合现有超市货品信息管理体系的特点&#xff0c;运用新技术&#xff0c;构建了以 vue为基础的超市货品信息管理信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员和用户二种角…

代码随想录算法训练营Day39 || leetCode 762.不同路径 || 63. 不同路径 II

62.不同路径 每一位的结果等于上方与左侧结果和 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector(n,0));for (int i 0; i < m; i) dp[i][0] 1;for (int j 0; j < n; j) dp[0][j] 1;for (int i 1; i < m; …

MySQL-----存储过程

▶ 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理的效率是有好处的。 存储过程思想上很简单&#xff0c;…

Vue3 快速上手从0到1,两小时学会【附源码】

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 以下内容为vue3的学习笔记 项目需要使用到的依赖 npm install axios npm install nanoid vue-router npm install pinia npm install mitt 源码&#xff1a;Gitee 运行 npm install npm run dev需要运…

蓝桥杯练习系统(算法训练)ALGO-982 最小距离

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 最小距离 问题描述 数轴上有n个数字&#xff0c;求最近的两个数&#xff0c;即min(abs(x-y)) 输入格式 第一行包含一个整数n。   …

IDEA编译安卓源码TVBox

因为电视x受限&#xff0c;无法观看电视直播&#xff0c;为了春晚不受影响&#xff0c;于是网络一顿搜索&#xff0c;试过多个APP&#xff0c;偶尔找到这款开源的TVBox&#xff0c;寒假在家&#xff0c;随便拿来练练手&#xff0c;学习安卓APP的编写&#xff0c;此文做以记录&a…

面向对象的编程语言是什么意思?——跟老吕学Python编程

面向对象的编程语言是什么意思&#xff1f;——跟老吕学Python编程 面向对象是什么意思&#xff1f;面向对象的定义面向对象的早期发展面向对象的背景1.审视问题域的视角2.抽象级别3.封装体4.可重用性 面向对象的特征面向对象的开发方法面向对象程序设计基本思想实现 面向对象的…

超级终端Terminator

安装 在终端中输入 sudo apt install terminator 使用 CtrlShiftT 打开终端 右键选择水平分割/垂直分割 或者使用 CtrlShiftO或CtrlShiftE CtrlShiftW可以撤销刚刚的分割&#xff08;删除终端窗口指令&#xff09; Alt箭头&#xff08;方向键&#xff09;可以在…

牛客周赛 Round 36 解题报告 | 珂学家 | 状态DP + 构造 + 9棵树状数组

前言 整体评价 今天相对容易&#xff0c;E的构造题&#xff0c;感谢出题人极其善意的Case 1, 算是放水了。F题是个很典的结论题&#xff0c;由于存在动态点修改&#xff0c;所以引入树状数组做区间和的快速计算。 A. 小红的数位删除 题型: 签到 s input()print (s[:-3])B. …

Gradle模块化最佳实践

一&#xff0c;模块化的原因及意义 模块化是一种将大型的软件系统拆分成相互独立的模块的方法。具有以下优势&#xff1a; 代码复用&#xff1a;不同的模块可以共享相同的代码。这样可以避免重复编写相同的代码&#xff0c;提高开发效率。模块独立性&#xff1a;每个模块都可…

Mysql数据库-基本表操作

1.表操作 创建表&#xff1a;CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c;如果没有指定字符集&#xff…

单文件组件SFC及Vue CLI脚手架的安装使用

单文件组件SFC及Vue CLI脚手架的安装使用 Vue 单文件组件&#xff08;又名 *.vue 文件&#xff0c;缩写为 SFC&#xff09;是一种特殊的文件格式&#xff0c;它允许将 Vue 组件的模板、逻辑 与 样式封装在单个文件中。 为什么要使用 SFC 使用 SFC 必须使用构建工具&#xff…