[算法基础 ~排序] Golang 实现

文章目录

  • 排序
    • 什么是排序
    • 排序的分类
      • 1. 冒泡
        • 1.1 冒泡排序
        • 1.2. 快速排序
      • 2. 选择
        • 2.1 简单选择排序
        • 2.2 堆排序
      • 3. 插入
        • 3.1 直接插入
        • 3.2 折半插入
        • 3.3 希尔排序
      • 4. 归并排序
        • 代码实现
      • 5. 基数排序


排序图片就不贴了吧

排序

在这里插入图片描述

什么是排序

以下部分动图来自CSDN

::: tip 稳定性的概念

定义:能保证两个相等的数,经过排序之后,其在序列的前后位置顺序不变。(A1=A2,排序前A1在A2前面,排序后A1还在A2前面)

意义:稳定性本质是维持具有相同属性的数据的插入顺序,如果后面需要使用该插入顺序排序,则稳定性排序可以避免这次排序。
:::

排序的分类

1. 冒泡

1.1 冒泡排序
  • 一个一个往上冒

:::details 查看代码

func BubbleSort(arr []int) []int {n := len(arr)for i := 0; i < n-1; i++ {for j := i + 1; j < n; j++ {if arr[i] > arr[j] {arr[i], arr[j] = arr[j], arr[i]}}}return arr
}
for(int i=0; i<k-1; i++)for(int j=i+1; j<k; j++){if(arr[j]<arr[i]){ // 从小到大arr[i] ^= arr[j];arr[j] ^= arr[i];arr[i] ^=arr[j];}}

:::

1.2. 快速排序
  • 升级版冒泡(递归

  • 基本思想

通过一趟排序将待排的数据分割成两部分,其中一部分的数据均比另一部分的数据要小,对两组数据进行排序。

:::details 查看代码

func QuickSort(a []int) []int {n := len(a)if n <= 1 {return a}left := make([]int, 0)right := make([]int, 0)guard := a[0]for i := 1; i < n; i++ {if a[i] < guard {left = append(left, a[i]) // 比哨兵小入左队} else {right = append(right, a[i]) // 其他入大队}}left, right = QuickSort(left), QuickSort(right)res := append(append(left, guard), right...)return res
}
// 左闭右开
func QuickSort1(a []int, left, right int) {if left >= right-1 {return}low := lefthigh := right - 1guard := a[low]for low < high {/*小的往左,大的往右*/for low < high && a[high] >= guard {high--}a[low] = a[high]for low < high && a[low] <= guard {low++}a[high] = a[low]}a[low] = guardQuickSort1(a, left, low)QuickSort1(a, low+1, right)
}
void q_sort(int a[], int left, int right){
// left, right 左闭右开, low、high闭区间
// a[left] 即左边第一个元素为哨兵if(left >= right-1 ) return;int low = left, high = right-1, center = a[low];// 直到low==high 确保左边的元素都比右边的小while( low < high ){// 从右边开始往回搜索,找到第一个比哨兵小的元素,比哨兵大则跳过while( low<high && a[high] >= center ) high --;// 将比哨兵小的元素移动到左边a[low] = a[high];// 从左边往右边搜索, 找到第一个比哨兵大的元素,比哨兵小则跳过while( low< high && a[low] <= center) low++;// 将比哨兵大的元素移动到右边a[high] = a[low];}// 把哨兵存入分界线位置a[low] = center;			// == a[high] = center;// 开始递归快排q_sort(a, left, low);		// 左边q_sort(a, low+1, right );	// 右边
}

快排优化版的简单示意图(以 3 5 2 1 6作为局部数组为例)

:::

2. 选择

2.1 简单选择排序
  • 选择最小的往前放

:::details 查看代码

func SelectSort(a []int) []int {n := len(a)for i := 0; i < n-1; i++ {minIndex := ifor j := i + 1; j < n; j++ {if a[j] < a[minIndex] {minIndex = j}}if minIndex != i {a[minIndex], a[i] = a[i], a[minIndex]}}return a
}
// 从小到大 
for(int i=0; i<length-1; i++){minIndex=i;for(int j=i+1; j<length{if(arr[j]<arr[minIndex]) minIndex=j; // 选择最小的元素的下标}if( minIndex != i){arr[i]^=arr[minIndex];arr[minIndex] ^=arr[i];arr[i] ^= arr[minIndex];}
}
  • 这里有一个小小的优化技巧

在搜索最小数下标的时候,同时搜索最大数的下标,可以使得复杂度减半。

:::

2.2 堆排序

::: details 先来了解下堆的相关概念:

堆是具有以下性质的完全二叉树:

每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆

或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

如下图:

同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子

该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] (小到大排序)

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] (大到小排序)

:::

:::details 堆的百度百科
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。

堆总是满足下列性质:

  • 堆中某个结点的值总是不大于或不小于其父结点的值;
  • 堆总是一棵完全二叉树。

:::details 完全二叉树

  • 完全二叉树的特点:
    • 叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。

需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树

  • 判断一棵树是否是完全二叉树的思路

1>如果树为空,则直接返回错

2>如果树不为空:层序遍历二叉树

2.1>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;

2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;

2.2>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空,且则该节点之后的队列中的结点都为叶子节点,该树才是完全二叉树,否则就不是完全二叉树.
:::

了解了这些定义。接下来看看堆排序的基本思想及基本步骤:

  • 堆排序基本思想及步骤

基于选择排序

堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

:::details 查看代码

// 构建小顶堆, 大到小排序// 交互a数组中的x跟y
void swap(int a[], int x, int y){a[x] ^= a[y];a[y] ^= a[x];a[x] ^= a[y];
}// 调整堆
void heapAdjust(int a[], int i, int len){int flag = a[i];for(int j=2*i; j<=len; j*=2 ){if( j<len && a[j]>a[j+1] ) ++j;if( flag < a[j] ) break;a[i] = a[j]; i=j;}a[i] = flag;
}// 堆排序
void heapSort(int a[], int len){for(int i=len/2; i>0; --i){heapAdjust(a, i, len);}for(int i=len; i>1; i--){swap(a, 1, i);heapAdjust(a, 1, i-1);}
}

:::

3. 插入

::: tip 与现实场景的联系
存在一个已经排好的队伍(从矮到高),这时,来了个还没排的家伙,他需要去找他需要站的位置。

:::

3.1 直接插入
  • 从后往前, 默认前面已排好序
  • 假设j前面j-1的元素已经是有序的,接下来要对a[j] 的位置查找

:::details 查看代码

func InsertSort(a []int) []int {n := len(a)for i := 1; i < n; i++ {for j := i; j > 0 && a[j] < a[j-1]; j-- {a[j-1], a[j] = a[j], a[j-1]}}return a
}
// 从小到大
for(int i=1; i<length; i++){for(int j=i; (j>0) && ( arr[j]<arr[j-1] ); j--){arr[j]^=arr[j-1];arr[j-1] ^= arr[j];arr[j] ^=arr[j-1];}
}

:::

3.2 折半插入

从1开始,对后面的元素进行折半查找插入

:::details 查看代码

func BinarySearchInsertSort(a []int) []int {n := len(a)var low, high, mid, reg intfor i := 1; i < n; i++ {low = 0high = i - 1reg = a[i]for low <= high {mid = (low + high) >> 1if reg > a[mid] {low = mid + 1} else {high = mid - 1}}/*low是还没排序的元素应该去的位置,所以low后面已排序的元素都要往后站*/for j := i; j > low; j-- {a[j] = a[j-1]}a[low] = reg}return a
}
// 降序(从大到小)
void z_sort(int a[], int len){int low = 0,high = 0,mid;int temp = 0;for (int i=1; i<len; i++) {low=0;high=i-1;temp=a[i];		// 要插入的元素while (low<=high) {mid=(low+high)>>1;// 决定顺序的位置if (a[mid]<temp) {high=mid-1;}else{low=mid+1;}}// 把元素后移for (int j=i; j>low; j--) {a[j]=a[j-1];}a[low]=temp;//插入元素}
}

:::

3.3 希尔排序

::: tip 百度百科
希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。


希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
    :::

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

  • 重点:注意对每个子序列进行插入排序

:::details 查看代码

func shellSort(a []int) []int {n := len(a)/*@gap: 增量每次减半*/for gap := n >> 1; gap >= 1; gap >>= 1 {for i := gap; i < n; i += gap {for j := i; j > 0 && a[j] < a[j-gap]; j -= gap {a[j-gap], a[j] = a[j], a[j-gap]}}}return a
}
void shellSort(int* a, int n)
{int i,gap,j;// gap为步长,每次减为原来的一半。for (gap = n / 2; gap >=1 ; gap /= 2){// 组内排序for (i = gap ;i < n; i+= gap) {for(j = i; j>0 && a[j] < a[j-gap]; j-= gap) {swap(a[j-gap], a[j]);}}}
}

:::

4. 归并排序

  • 基本思想

归并排序是用分治思想,分治模式在每一层递归上有三个步骤:

  • 分解(Divide):将n个元素分成个含n/2个元素的子序列。
  • 解决(Conquer):用合并排序法对两个子序列递归的排序。
  • 合并(Combine):合并两个已排序的子序列已得到排序结果。
  • 实现逻辑

2.1 迭代法

① 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

② 设定两个指针,最初位置分别为两个已经排序序列的起始位置

③ 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

④ 重复步骤③直到某一指针到达序列尾

⑤ 将另一序列剩下的所有元素直接复制到合并序列尾

2.2 递归法

① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素

② 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素

③ 重复步骤②,直到所有元素排序完毕

  • 动图演示

  • 归并排序演示

具体的我们以一组无序数列{14,12,15,13,11,16}为例分解说明,如下图所示:

上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。

  • 文字版

:::details

有序数组A:[3 8 9 11 13]
有序数组B:[1 5 8 10 17 19 20 23]
[] 表示比较的范围。因为 1 < 3,所以 1 加入辅助数组
有序数组A:[3 8 9 11 13]
有序数组B:1 [5 8 10 17 19 20 23] 
辅助数组:1因为 3 < 5,所以 3 加入辅助数组
有序数组A:3 [8 9 11 13]
有序数组B:1 [5 8 10 17 19 20 23] 
辅助数组:1 3因为 5 < 8,所以 5 加入辅助数组
有序数组A:3 [8 9 11 13]
有序数组B:1 5 [8 10 17 19 20 23] 
辅助数组:1 3 5
因为 8 == 8,所以 两个数都 加入辅助数组有序数组A:3 8 [9 11 13]
有序数组B:1 5 8 [10 17 19 20 23] 
辅助数组:1 3 5 8 8
因为 9 < 10,所以 9 加入辅助数组有序数组A:3 8 9 [11 13]
有序数组B:1 5 8 [10 17 19 20 23] 
辅助数组:1 3 5 8 8 9因为 10 < 11,所以 10 加入辅助数组
有序数组A:3 8 9 [11 13]
有序数组B:1 5 8 10 [17 19 20 23] 
辅助数组:1 3 5 8 8 9 10因为 11 < 17,所以 11 加入辅助数组
有序数组A:3 8 9 11 [13]
有序数组B:1 5 8 10 [17 19 20 23] 
辅助数组:1 3 5 8 8 9 10 11因为 13 < 17,所以 13 加入辅助数组
有序数组A:3 8 9 11 13
有序数组B:1 5 8 10 [17 19 20 23] 
辅助数组:1 3 5 8 8 9 10 11 13因为数组A已经没有比较元素,将数组B剩下的元素拼接在辅助数组后面。
结果:1 3 5 8 8 9 10 11 13 17 19 20 23

:::

代码实现
  • 自顶向下归并(递归)

:::details 查看代码

// 二路归并
func MergeSort(a []int) []int {n := len(a)if n <= 1 {return a}mid := n >> 1left, right := MergeSort(a[:mid]), MergeSort(a[mid:])return merge(left, right)
}func merge(left, right []int) (res []int) {l, r := 0, 0len_l, len_r := len(left), len(right)for l < len_l && r < len_r {if left[l] < right[r] {res = append(res, left[l])l++} else {res = append(res, right[r])r++}}// 把两个子切片的剩余元素直接入队res = append(append(res, left[l:]...), right[r:]...)return
}
// 归并排序(C-递归版)void merge_sort_recursive(int arr[], int reg[], int start, int end) {if (start >= end)return;int len = end - start, mid = (len / 2) + start;int start1 = start, end1 = mid;int start2 = mid + 1, end2 = end;merge_sort_recursive(arr, reg, start1, end1);merge_sort_recursive(arr, reg, start2, end2);int k = start;// 决定是降序还是升序while (start1 <= end1 && start2 <= end2)reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];while (start1 <= end1)reg[k++] = arr[start1++];while (start2 <= end2)reg[k++] = arr[start2++];for (k = start; k <= end; k++)arr[k] = reg[k];
}
void merge_sort(int arr[], const int len) {int *reg = new int[len+1];merge_sort_recursive(arr, reg, 0, len - 1);delete[] reg;
}

:::

  • 自底向上归并(迭代)

:::details 查看代码

func MergeSort(a []int, begin, end int) {step := 1// 步数为1开始,step长度的数组表示一个有序的数组// 1 -> 2 -> 4 -> 8for end-begin > step {// 从头到尾对数组进行归并操作// step << 1 = 2 * step 表示偏移到后两个有序数组将它们进行归并for i := begin; i < end; i += step << 1 {low := imid := low + stephigh := low + (step << 1)// 不存在第二个数组,直接返回if mid > end {return}// 第二个数组长度不够if high > end {high = end}// 合并两个有序的数组merge(a, low, mid, high)}step <<= 1}
}func merge(a []int, begin, mid, end int) {leftSize := mid - beginrightSize := end - midnewSize := leftSize + rightSizeresult := make([]int, 0, newSize)l, r := 0, 0for l < leftSize && r < rightSize {lval := a[begin+l]rval := a[mid+r]if lval < rval {result = append(result, lval)l++} else {result = append(result, rval)r++}}result = append(result, a[begin+l:mid]...)result = append(result, a[mid+r:end]...)for i := 0; i < newSize; i++ {a[begin+i] = result[i]}return
}
void mergeSort(int a[], int reg[], const int end){// 分for(int step=1; step<end; step*=2){for(int j=0; j < end; j += step*2 ){int low = j, mid = j+step-1, high = min(j+2*step-1, end-1);merge(a, reg, low, mid, high );}}
}void merge(int a[], int reg[],  int l, const int mid, const int r){int start = l;int end = r;int j = mid+1;int i = l;while( i<= mid &&  j<= r ){reg[l++] = a[i]>=a[j]   ? a[i++] : a[j++];}while(i<=mid) reg[l++] = a[i++];while(j<=r) reg[l++] = a[j++];for(int ii=start; ii<=end; ii++){a[ii] = reg[ii];}
}

:::

5. 基数排序

:::details 查看代码

func getbits(a []int) int {max_num := 0for _, v := range a {if v > max_num {max_num = v}}res := 0if max_num == 0 {return 1}for max_num > 0 {max_num /= 10res++}return res
}func radixSort(a []int) {n := len(a)step := getbits(a)radix := 1var num, tail intreg := make([][]int, 10)for i := 0; i < step; i++ {radix *= 10// 每一轮都要清空桶for i := 0; i < 10; i++ {reg[i] = make([]int, 0)}for j := 0; j < n; j++ {num = a[j] % radixtail = num / (radix / 10)reg[tail] = append(reg[tail], a[j])}index := 0for k := 0; k < 10; k++ {for _, v := range reg[k] {a[index] = vindex++}}}
}
#include<iostream>
using namespace std;int maxbit(int data[], int n) //辅助函数,求数据的最大位数
{int d = 1; //保存最大的位数int p = 10;for(int i = 0; i < n; ++i){while(data[i] >= p){p *= 10;++d;}}return d;
}
void radixSort(int data[], int n) //基数排序
{// d 位int d = maxbit(data, n);int *tmp = new int[n+5];int *count = new int[10]; //计数器 --> 排序桶int *flag = new int[10];int i, j, k;int radix = 1;for(i = 1; i <= d; i++) //进行d次排序{for(j = 0; j < 10; j++){count[j] = 0; //每次分配前清空计数器(清桶)tmp[j] = -1;flag[j] = 0;}for(j = 0; j < n; j++){// k 是当前数字位置中的数字k = (data[j] / radix) % 10; //统计每个桶中的记录数count[k]++;}for(int jj=0; jj<10; jj++){flag[jj] = count[jj];}for(j = 1; j < 10; j++)count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶for(j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中{k = (data[j] / radix) % 10;tmp[count[k] - 1] = data[j];count[k]--;}for(j = 0; j < n; j++){//将临时数组的内容复制到data中data[j] = tmp[j];}radix = radix * 10;}delete[]tmp;delete[]count;
}

:::

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

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

相关文章

【Kubernetes】存储类StorageClass

存储类StorageClass 一、StorageClass介绍二、安装nfs provisioner&#xff0c;用于配合存储类动态生成pv2.1、创建运行nfs-provisioner需要的sa账号2.2、对sa授权2.3、安装nfs-provisioner程序 三、创建storageclass&#xff0c;动态供给pv四、创建pvc&#xff0c;通过storage…

mysql:用SHOW COLUMNS FROM显示一个表的列信息

可以使用命令SHOW COLUMNS FROM table_name;显示一个表的列信息&#xff0c;例如&#xff1a;

Java se的语言特征之多态

目录 满足多态的条件动态绑定第一步动态绑定第二步动态绑定第三步参数列表,返回类型,访问修饰限定符区别有动态绑定,那是不是有静态绑定向下转型抽象类接口实现多个接口(先继承再接口,接口用",") 满足多态的条件 定义:去完成某个状态的时候,当不同的对象去完成的时候…

36V H 桥有刷直流驱动芯片GC8870 GC8871 GC8872的数据选型分析

36V H 桥驱动芯片GC8870 GC8871 GC8872都可替代TI的DRV8870/8871/8872&#xff0c;宽电压&#xff0c;内置电荷泵&#xff0c;短地短电源保护&#xff0c;限流等功能&#xff0c;可应用于水泵&#xff0c;扫地机器人&#xff0c;开关等产品中

数据库系统 --- 关系模型

一、关系模型的数据结构以及形式化定义 1.关系 域&#xff1a;一组具有相同数据结构的值的集合。 笛卡尔积&#xff1a;域上的一种集合运算。多个集合做笛卡尔积的结果是每个集合取一个元素组合得到的一个新的集合。 域的基数&#xff1a;一个域上允许的不同取值的个数。 关系&…

护眼台灯为什么护眼?适合备考使用的台灯推荐

台灯是大家生活中必不可少的一盏灯具&#xff0c;尤其是当夜幕降临时&#xff0c;许多仍然需要工作、或者学习的人&#xff0c;都要使用台灯来提供充足的照明环境。如今随着生活的高度发展&#xff0c;大家对台灯的要求也愈发精进了一步&#xff0c;不仅需要能够提供照明的&…

报表控件FastReport .NET v2024功能演示—更改图图片形状

报表生成器FastReport .NET 是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体的全功能报告库。使用FastReport .NET&#xff0c;您可以创建独立于应用程序的.NET报告。 FastReport .net下载&#xff08;qun&#xff1a;585577353&#xff09;https://www.e…

配电箱安全检查

配电箱怎么检查&#xff0c;如何识破电箱安全隐患&#xff1f; &#xff08;1&#xff09;一物一码&#xff1a;每个配电箱都有独一无二标识二维码&#xff0c;巡检人员到达现场扫码即可填写巡检记录&#xff0c;查看配电箱的参数、负责人、操作规则等信息&#xff1b; &#x…

如何用PHP写一个1688平台下的商品API接口代码?

一 定义 PHP&#xff08;全称&#xff1a;Hypertext Preprocessor&#xff09;是一种广泛用于开发Web应用程序的服务器端脚本语言。它是一种开源的编程语言&#xff0c;特别适用于快速构建动态网页和Web应用程序。 在PHP中&#xff0c;您可以使用1688商品API接口来获取和操作…

韵达速递查询,韵达速递单号查询,对需要的单号记录进行标记

批量查询韵达速递单号的物流信息&#xff0c;对需要的单号记录进行标记。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角…

starknet学习资料汇集这一篇就够了(持续更新)

文章目录 官方资料wtf starknet学习资料Starknet Astro 社区官方资料 starknet-foundry 官方github:https://github.com/foundry-rs/starknet-foundry 官方文档:https://foundry-rs.github.io/starknet-foundry/ https://book.cairo-lang.org/zh-cn/index.html https://boo…

银行如何筛选跨网文件交换产品,提升业务效率?

银行业在我国经济发展和社会运转中承载着举足轻重的作用和意义&#xff0c;进入互联网时代&#xff0c;网络的运算和数据管理能力助力银行业高速发展&#xff0c;但同样带来了一些网络安全隐患&#xff0c;网络攻击、数据窃取、敏感信息泄露等问题影响着银行业的根基。为响应和…

python作业题百度网盘,python123作业答案

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python作业题百度网盘&#xff0c;python123作业答案&#xff0c;今天让我们一起来看看吧&#xff01; 完整项目分享&#xff1a; 链接: https://pan.baidu.com/s/1CTMOgLYteLrWRaRnouB0SQ?pwd12hf 提取码: 12hf &…

[Linux 基础] Linux使用git上传gitee三板斧

文章目录 1、使用git1.1 安装git1.2 在Gitee上创建项目1.2.1 使用Gitee创建项目1.2.2 上传本地代码到远端仓库 1.3 git上传三板斧1.3.1 三板斧第一招&#xff1a;git add1.3.2 三板斧第二招&#xff1a;git commit1.3.3 三板斧第三招&#xff1a;git push 1、使用git 1.1 安装…

【教3妹学编程-算法题】下一个更大元素 IV

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开发。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&#x…

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c 鸿鹄云商

鸿鹄云商 SAAS云产品概述 【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多…

MQ-Det: Multi-modal Queried Object Detection in the Wild

首个支持视觉和文本查询的开放集目标检测方法 NeurIPS2023 文章&#xff1a;https://arxiv.org/abs/2305.18980 代码&#xff1a;https://github.com/YifanXu74/MQ-Det 主框图 摘要 这篇文章提出了MQ-Det&#xff0c;一种高效的架构和预训练策略&#xff0c;它利用文本描述的…

以csv为源 flink 创建paimon 临时表相关 join 操作

目录 概述配置关键配置测试启动 kyuubi执行配置中的命令 bug解决bug01bug02 结束 概述 目标&#xff1a;生产中有需要外部源数据做paimon的数据源&#xff0c;生成临时表&#xff0c;以使用与现有正式表做相关统计及 join 操作。 环境&#xff1a;各组件版本如下 kyuubi 1.8…

Spring(Spring/Springboot 的创建) 基础

一. Spring 1.1 Spring是什么&#xff1f; Spring 指的是 Spring Frameword(Spring 框架),它是一个开源框架。 Spring 是包含了众多工具方法的IoC容器。 1.2 什么是容器&#xff1f; 容器时用来容纳某种物品的装置。 我们之前接触到的容器&#xff1a; • List/Map ->…

内存cache大量使用问题导致应用异常问题

概述 28s应用崩溃查看内存使用有大量cache。 分析 查看free 信息平时的确存在大量cache使用的情况查看dmes信息发现filesendserver崩溃 崩溃信息为系统调用 查看到page allocation failure:order 5 同时也看到系统内存使用情况 查看到系统实际还有部分内存为空闲内存&am…