数据结构 排序

数据结构 排序

文章目录

  • 数据结构 排序
    • 1. 排序的概念及引用
      • 1.1 排序的概念
      • 1.2 常见的排序算法
    • 2.常见排序算法的实现
      • 2.1 插入排序
        • 2.1.1 基本思想
        • 2.1.2 直接插入排序
        • 2.1.3 希尔排序(缩小增量排序)
      • 2.2 选择排序
        • 2.2.1 基本思想
        • 2.2.2 直接选择排序
        • 2.2.3 堆排序
      • 2.3 交换排序
        • 2.3.1 基本思想
        • 2.3.2 冒泡排序
        • 2.3.2 快速排序
        • 2.3.3 非递归-快排
      • 2.4 归并排序
    • 3. 排序算法复杂度及稳定性分析
    • 4. 其它非基于比较的排序(拓展)

1. 排序的概念及引用

1.1 排序的概念

排序:所谓排序,就是使一串记录按照其中的某个或某些关键字的大小进行递增或递减的排列操作

稳定性: 若两元素相同,排序后第一个元素依旧在第二个元素之前,则称排序算法是稳定的,否则称为不稳定的,如图:

在这里插入图片描述

内部排序: 数据元素全部放在内存中的排序;

外部排序: 数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

1.2 常见的排序算法

在这里插入图片描述

本文将对以上排序算法进行分析

2.常见排序算法的实现

2.1 插入排序

2.1.1 基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。实际中我们玩扑克牌时,就用了插入排序的思想:

在这里插入图片描述

2.1.2 直接插入排序

操作方法:

  • 传入数组arr,此时需要插入元素下标设为i
  • arr[i]依次与arr[i-1], arr[i-2]等元素进行比较,直到找到合适的插入位置k
  • 将(k-i)之间的元素依次往后移动一个位置,再将arr[i] 插入到k位置
  • 重复上述操作,直到i下标遍历结束

在这里插入图片描述

代码示例:

/*** 直接插入排序* 时间复杂度:最好O(n) 最坏O(n²)* 空间复杂度:O(1)* 稳定性:稳定* 适用范围:基本上趋于有序的序列,其越有序速度越快*/
public  void insertSort(int[] arr) {for (int i = 0;i < arr.length;i++) {int temp = arr[i];int j = i - 1;for (;j >= 0;j--) {if (arr[j] > temp) {arr[j+1] = arr[j];}else {break;}}arr[j+1] = temp;}}

在这里插入图片描述

直接插入排序特性:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:最好O(N),最坏O(N²)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定
2.1.3 希尔排序(缩小增量排序)

希尔排序法由称缩小增量法。希尔排序法的基本思想是:先选定一个整数(gap),把待排序文件中所有记录分成多个组,所有距离相等的分在同一个组内,并对每一组内的记录进行排序。然后,取原来gap的一半,重复上述分组和排序的工作。当gap = 1时,所有记录已经在统一组内排好序

在这里插入图片描述

代码示例:

 /*** 希尔排序* 是对直接插入排序的优化* @param arr*/public void shellSort(int[] arr) {int gap = arr.length;while(gap > 1) {gap /= 2;shell(arr, gap);}}private void shell(int[] arr, int gap) {for (int i = gap;i < arr.length;i++) {int temp = arr[i];int j = i - gap;for (;j >= 0;j -= gap) {if (arr[j] > temp) {arr[j+gap] = arr[j];}else {break;}}arr[j+gap] = temp;}}

在这里插入图片描述

希尔排序特性:

  1. 可以认为希尔排序是对直接插入排序的优化

  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap = 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比

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

    《数据结构(C语言版)》—严蔚敏

    在这里插入图片描述

    《数据结构–用面向对象方法与C++描述》—殷人昆

    在这里插入图片描述

    在这里我们按照O(n^1.25)到O(1.6 * n ^ 1.25)来算

  4. 稳定性:不稳定

2.2 选择排序

2.2.1 基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

2.2.2 直接选择排序
  1. 在元素集合中选择关键码(下标)最大(或最小)的元素,将最小值设置为该下标元素
  2. 依次与下标后面的元素进行比较,将最小值的下标记录下来
  3. 直到下标遍历到数组最后,将此时最小值下标元素与最开始最小值的下标元素进行交换

在这里插入图片描述
1380)

代码示例:

 /*** 直接选择排序* 时间复杂度 O(N²)* 空间复杂度 O(1)* 稳定性:不稳定* 适用范围:效率不高,实际很少使用*/public void selectSort(int[] arr) {for (int i = 0;i < arr.length;i++) {int min = i;for (int j = i;j < arr.length;j++) {if (arr[j] < arr[min]) {min = j;}}swap(arr,min,i);}}private void swap(int[] arr, int x, int y) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}

在这里插入图片描述

直接选择排序性质:

  1. 直接选择排序思路容易理解,但效率不高,实际中很少使用
  2. 时间复杂度 O(N²)
  3. 空间复杂度 O(1)
  4. 稳定性:不稳定

在这里我们可以对直接选择排序进行一个优化:

/*直接排序优化版*/public void selectSort2(int[] arr) {int left = 0;int right = arr.length - 1;while(left < right) {int minIndex = left;int maxIndex = left;for (int i = left + 1;i <= right;i++) {if (arr[i] > arr[maxIndex]) {maxIndex = i;}if (arr[i] < arr[minIndex]) {minIndex = i;}}swap(arr,minIndex,left);//此时如果maxIndex与left相等,// 需要将maxIndex位置修改为此时的minIndex位置,// 因为前面已经将left与minIndex位置的元素进行了交换if (maxIndex == left) {maxIndex = minIndex;}swap(arr,maxIndex,right);left++;right--;}}

在这里插入图片描述

2.2.3 堆排序

堆排序在之前的文章堆的应用中有举例过,这里再复习一下

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

在这里插入图片描述

代码示例:

    /*** 堆排序* 1. 堆排序使用堆来选数,效率高了很多* 2. 时间复杂度:O(N*log₂N)* 3. 空间复杂度:O(1)* 4. 稳定性:不稳定* @param arr*/public void heapSort(int[] arr) {createHeap(arr);int end = arr.length - 1;while(end > 0) {swap(arr, 0, end);shiftBigDown(arr, 0, end);end--;}}public void createHeap(int[] array) {for (int parent = (array.length - 1 - 1)/2;parent >= 0;parent--) {shiftBigDown(array,parent,array.length);}}public void shiftBigDown(int[] elem, int parent,int len) {//左孩子int child = 2 * parent + 1;while(child < len) {//判断是否存在右孩子 且右孩子和左孩子哪个更大,大的为childif (child+1 < len &&  elem[child+1] > elem[child]) {child++;}//判断根节点和child的大小,若根节点大则结束遍历,否则交换两个节点if (elem[child] > elem[parent]) {swap(elem, child, parent);parent = child;child = 2 * parent + 1;}else {break;}}}

在这里插入图片描述

堆排序特性:

  1. 堆排序使用堆来选数,效率高了很多
  2. 时间复杂度:O(N*log₂N)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

2.3 交换排序

2.3.1 基本思想

所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动

2.3.2 冒泡排序

在写数组的时候有介绍过冒泡,这里再来复习一下:

以升序为例:

  1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾
  2. 依次重复上述过程,直到数组中所有的元素都排列好

在这里插入图片描述

代码示例:

/*** 冒泡排序* 1. 容易理解,优化后效率高* 2. 时间复杂度:O(N²)  优化后最好情况可达O(N)* 3. 空间复杂度:O(1)* 4. 稳定性:稳定*/public void bubbleSort(int[] arr) {for (int i = 0;i < arr.length;i++) {boolean flg = false;for (int j = 0;j < arr.length - i - 1;j++) {//如果走完一圈后发现没有交换过,说明整个数组元素已经有序,后面直接退出循环if (arr[j+1] < arr[j]) {swap(arr,j,j+1);flg = true;}}if (!flg) {break;}}}

在这里插入图片描述

冒泡排序特性:

  1. 容易理解,优化后效率高
  2. 时间复杂度:O(N²) 优化后最好情况可达O(N)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定
2.3.2 快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复==(利用递归)==该过程,直到所有元素都排列在相应位置上为止

主框架代码示例:

 //假设按照升序对arr数组中[left,right)区间的元素进行排序public void quickSort(int[] arr, int left, int right) {if (left >= right) {return;}//按照基准值对arr数组的[left,right)区间中的元素进行划分int div = partitionHoare(arr, left, right);//划分成功后以div为边界形成了左右两部分[left,div)和[div,right)//递归排[left,div)quickSort(arr, left, div);//递归排[div+1,right)quickSort(arr, div + 1, right);}

将区间按照基准值划分为左右两半部分的常见方式有:

  1. Hoare版

    在这里插入图片描述

    代码示例:

    /*Hoare法*/
    public int partitionHoare(int[] arr, int left, int right) {int i = left;int j = right;int pivot = left;while(i < j) {while(i < j && arr[j] >= arr[pivot]) {j--;}while(i < j && arr[i] <= arr[pivot]) {i++;}swap(arr, i, j);}swap(arr, i, pivot);return i;}
    

在这里插入图片描述

  1. 挖坑法

    基本思路:

    1. 先选取一个基准值(这里我们设置第一个数为基准值),选出来后认为此位置为空(坑)
    2. 从右遍历直到找到小于该基准值的元素,然后将该元素填到前面的坑,同时此位置变为空(坑)
    3. 从左遍历直到找到大于该基准值的元素,然后将该元素填到前面的坑,同时此位置变为空(坑)
    4. 若左右指针未相遇,重复上述2,3操作
    5. 当左右指针相遇时,将相遇位置的值修改为基准值

    在这里插入图片描述

    代码示例:

    /*挖坑法*/public int partition(int[] arr, int left, int right) {int i = left;int j = right;int pivot = left;while(i < j) {while(i < j && arr[j] >= arr[pivot]) {j--;}arr[i] = arr[j]; //将j位置的元素赋给i位置,此时虽然有两个相同的,但j位置的元素可以相当于空while(i < j && arr[i] <= arr[pivot]) {i++;}arr[j] = arr[i]; //将i位置的元素}swap(arr, pivot, i);return i;}
    

    在这里插入图片描述

  2. 前后指针法:

    基本思路:

    1. 先选取一个基准值(这里我们设置第一个数为基准值),设置两个指针prevcur,prev从左边第一个值开始,cur开始为prev+1
    2. 若cur此时小于基准值,则prev++,并且判断prev++后是否等于此时的cur,若不等于,交换cur与prev
    3. 每次判断完都要移动cur(cur++)
    4. 直到cur>最后一个下标,则交换prev和基准值,然后将此时prev的位置返回

    在这里插入图片描述

    代码示例:

     /*前后指针法*/public int partition2(int[] arr, int left, int right) {int pivot = left; //基准值int prev = left;int cur = left + 1;while(cur <= right) {if (arr[cur] < arr[pivot] && arr[++prev] != arr[cur]) {swap(arr,prev,cur);}cur++;}swap(arr,pivot,prev);return prev;}
    

    在这里插入图片描述

2.3.3 非递归-快排

非递归方式版本的快速排序:

	/*非递归-快排*/public void quickSortNor(int[] arr) {int start = 0;int end = arr.length - 1;Stack<Integer> stack = new Stack<>();int pivot = partitionHoare(arr, start, end);if (pivot - 1 > start) {stack.push(start);stack.push(pivot-1);}if (pivot + 1 < end) {stack.push(pivot+1);stack.push(end);}while(!stack.isEmpty()) {end = stack.pop();start = stack.pop();pivot = partitionHoare(arr, start, end);if (pivot - 1 > start) {stack.push(start);stack.push(pivot-1);}if (pivot + 1 < end) {stack.push(pivot+1);stack.push(end);}}}

在这里插入图片描述

快排特性:

  1. 快速排序整体的综合性能和使用场景都是比较好的
  2. 时间复杂度:O(N*log₂N)
  3. 空间复杂度:O(log₂N)
  4. 稳定性:不稳定

2.4 归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。做法就是将已有序的子序列合并,从而得到完全有序的序列,即先使每个子序列有序,再使子序列段之间有序。若将两个有序表合并成一个有序表,称为二路归并:

在这里插入图片描述

在这里插入图片描述

代码示例:

/*** 归并排序*/public void mergeSort(int[] arr) {mergeSortFun(arr, 0, arr.length - 1);}private void mergeSortFun(int[] arr, int start, int end) {if (start >= end) {return;}int mid = (start + end) / 2;mergeSortFun(arr, start, mid);mergeSortFun(arr, mid + 1, end);//合并merge(arr, start, mid, end);}private void merge(int[] arr, int left, int mid, int right) {int s1 = left; //数组一起始位置int e1 = mid; //数组一结束位置int s2 = mid + 1; //数组二起始位置int e2 = right; //数组二结束位置// 定义一个新的数组int[] newArr = new int[right-left+1];int k = 0; //新数组下标while(s1 <= e1 && s2 <= e2) {if (arr[s1] < arr[s2]) {newArr[k++] = arr[s1++]; //赋完值后两个下标都要往后走}else {newArr[k++] = arr[s2++];}}//其中一个数组走完了,将另一个数组所有的值都赋到新的数组while(s1 <= e1) {newArr[k++] = arr[s1++];}while(s2 <= e2) {newArr[k++] = arr[s2++];}//将传入数组转换为新数组for (int i = 0;i < newArr.length;i++) {arr[i + left] = newArr[i];}}

在这里插入图片描述

归并排序特性:

  1. 归并排序的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题
  2. 时间复杂度:O(N*log₂N)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定

拓展:

  • 外部排序:排序过程需要在磁盘等外部存储进行的排序

    前提:内存只有1G,需要排序的数据有100G

    因为内存中无法把所有的数据全部放下,所有需要外部排序,而归并排序是最常用的外部排序

    1. 先把文件切分成200份,每个512M
    2. 分别对512M排序,因为内存已经可以放的下,所有任意排序方式都可以
    3. 进行二路归并,同时对200分有序文件做归并过程,最终结果就有序了

3. 排序算法复杂度及稳定性分析

在这里插入图片描述

排序方法最好平均最坏空间复杂度稳定性
冒泡排序O(n)O(n^2)O(n^2)O(1)稳定
插入排序O(n)O(n^2)O(n^2)O(1)稳定
选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定
希尔排序O(n)O(n^1.3)O(n^2)O(1)不稳定
堆排序O(n * log(n))O(n * log(n))O(n * log(n))O(1)不稳定
快速排序O(n * log(n))O(n * log(n))O(n^2)O(log(n)) ~ O(n)不稳定
归并排序O(n * log(n))O(n * log(n))O(n * log(n))O(n)稳定

4. 其它非基于比较的排序(拓展)

我们这里拓展一个排序算法-计数排序

基本思想:计数排序又称鸽巢原理,是对哈希直接定址法的变形应用。操作步骤:

  1. 统计相同元素出现的次数
  2. 根据统计的结果将序列回收到原来的序列中

在这里插入图片描述

代码示例:

/*** 计数排序* 1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限* 2. 时间复杂度:O(MAX(N,范围))* 3. 空间复杂度:O(范围)* 4. 稳定性:稳定*/public void countSort(int[] arr) {int minVal = arr[0];int maxVal = arr[0];for (int i = 0;i < arr.length;i++) {//找到数组最大值和最小值用来求新数组长度if (arr[i] > maxVal) {maxVal = arr[i];}if (arr[i] < minVal) {minVal = arr[i];}}// 确定计数数组长度int len = maxVal - minVal + 1;int[] count = new int[len];// 遍历arr数组,把arr数组中出现元素的次数记录在计数数组中for (int i = 0;i < arr.length;i++) {count[arr[i] - minVal]++;}// 此时计数数组已经存放了每个数据出现的次数// 遍历计数组,把实际的数据写回arr数组int index = 0;for (int j = 0;j < count.length;j++) {while(count[j] > 0) {arr[index] = minVal + j;index++;count[j]--;}}}

在这里插入图片描述

计数排序特性:

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限
  2. 时间复杂度:O(MAX(N,范围))
  3. 空间复杂度:O(范围)
  4. 稳定性:稳定

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

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

相关文章

Java后端模拟面试 题集④

1.你先作个自我介绍吧 面试官您好&#xff0c;我叫张睿超&#xff0c;来自湖南长沙&#xff0c;大学毕业于湖南农业大学&#xff0c;是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图…

使用QT实现http里面的get和post

#1024程序员节&#xff5c;参与投稿&#xff0c;赢限定勋章和专属大奖# #假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# #你被什么样的BUG困扰过一周以上&#xff1f;# 在http里面下面这些方法和服务器的响应代码一起用于HTTP协议中的请求和响应交互。请注意&…

Spring Boot + EasyUI 创建第一个项目(一)

创建一个Spring Boot和EasyUI相结合的项目。 一、构建一个Spring Boot项目 Spring Boot之创建一个Spring Boot项目&#xff08;一&#xff09;-CSDN博客 二、配置Thymeleaf Spring Boot Thymeleaf&#xff08;十一&#xff09;_thymeleaf 设置字体_人……杰的博客-CSDN博客…

mybatisplus开启sql打印的三种方式

1、在application.yml文件中添加mybatisplus的配置文件 使用mybatisplus自带的log-impl配置&#xff0c;可以在控制台打印出sql语句、执行结果的数据集、数据结果条数等详细信息&#xff0c;这种方法适合再调试的时候使用&#xff0c;因为这个展示的信息详细&#xff0c;更便于…

【算法练习Day25】 重新安排行程N 皇后 解数独

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 重新安排行程N 皇后解数独总…

C# Socket通信从入门到精通(2)——多个同步TCP客户端C#代码实现

前言: 我们在开发Tcp客户端程序的时候,有时候在同一个软件上我们要连接多个服务器,这时候我们开发的一个客户端就不够使用了,这时候就需要我们开发出来的软件要支持连接多个服务器,最好是数量没有限制,这样我们就能应对任意数量的服务器连接,由于我们开发的Tcp客户端程…

使用 Visual Studio Code (VS Code) 作为 Visual C++ 6.0 (VC6) 的编辑器

使用 Visual Studio Code (VS Code) 作为 Visual C 6.0 (VC6) 的编辑器 由于一些众所周知的原因&#xff0c;我们不得不使用经典&#xff08;过时&#xff09;的比我们年龄还大的已有 25 年历史的 VC 6.0 来学习 C 语言。而对于现在来说&#xff0c;这个经典的 IDE 过于简陋&a…

Leetcode1833. 雪糕的最大数量

Every day a Leetcode 题目来源&#xff1a;1833. 雪糕的最大数量 解法1&#xff1a;贪心 排序 本题唯一的难点在于计数排序。 计数排序详解&#xff1a;C算法之计数排序 为了尽可能多的买到雪糕&#xff0c;我们选择从价格低的雪糕开始买&#xff0c;统计能够买到的雪糕…

Java学习_day03_变量数据类型运算符

文章目录 变量定义声明赋值使用简化 数据类型基本数据类型整型浮点型布尔型字符型空型 引用数据类型数据类型转换自动类型转换强制类型转换 运算符算术运算符赋值运算符比较运算符逻辑运算符位运算符条件运算符一元运算符二元运算符三元运算符运算符优先级 变量 变量类似于数学…

计算机算法分析与设计(12)---贪心算法(最优装载问题和哈夫曼编码问题)

文章目录 一、最优装载问题1.1 问题表述1.2 代码编写 二、哈夫曼编码2.1 哈夫曼编码概述2.2 前缀码2.3 问题描述2.4 代码思路2.5 代码编写 一、最优装载问题 1.1 问题表述 1. 有一批集装箱要装上一艘载重量为 c c c 的轮船&#xff0c;已知集装箱 i ( 1 ≤ i ≤ n ) i(1≤i≤…

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

目前&#xff0c;大模型凭借超强的学习能力&#xff0c;已经在搜索、推荐、智能交互、AIGC、生产流程变革、产业提效等场景表现出巨大的潜力。大模型经过海量数据的预训练&#xff0c;通常具有良好的通用性和泛化性。用户基于“大模型预训练微调”开发范式即可在实际业务场景取…

MySQL——练习

MySQL 一、练习要求二、练习过程 一、练习要求 创建表并插入数据&#xff1a; 字段名数据类型主键外键非空唯一自增idINT是否是是否nameVARCHAR(50)否否是否否glassVARCHAR(50)否否是否否 sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 21、创建一个可以统计…

PostgreSQL与MySQL数据库对比:适用场景和选择指南

数据库是现代应用程序的基石之一&#xff0c;而在选择合适的数据库管理系统&#xff08;DBMS&#xff09;时&#xff0c;开发者常常会面临着许多选择。在这方面&#xff0c;PostgreSQL和MySQL是两个备受瞩目的选项。本文将深入研究这两者之间的异同&#xff0c;并为您提供适用场…

【使用OpenCV进行目标分割与计数的代码实例详解】

文章目录 概要实例一&#xff1a;硬币分割计数实例二&#xff1a;玉米粒分割计数 概要 在当今数字图像处理领域&#xff0c;图像分割技术是一项至关重要的任务。图像分割旨在将图像中的不同目标或区域准确地分开&#xff0c;为计算机视觉、图像识别和机器学习等领域提供了坚实…

[C语言]排序的大乱炖——喵喵的成长记

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

【微服务 SpringCloud】实用篇 · Ribbon负载均衡

微服务&#xff08;4&#xff09; 文章目录 微服务&#xff08;4&#xff09;1. 负载均衡原理2. 源码跟踪1&#xff09;LoadBalancerIntercepor2&#xff09;LoadBalancerClient3&#xff09;负载均衡策略IRule4&#xff09;总结 3. 负载均衡策略3.1 负载均衡策略3.2 自定义负载…

C++前缀和算法的应用:向下取整数对和 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 向下取整数对和 给你一个整数数组 nums &#xff0c;请你返回所有下标对 0 < i, j < nums.length 的 floor(nums[i] / nums[j]) 结果之和。由于答案可能会…

Kubeadm部署k8s集群 kuboard

目录 主机准备 主机配置 修改主机名&#xff08;三个节点分别执行&#xff09; 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包&#xff08;所有节点&#xff09; 系统参数设置(所有节点) 时间同步(所有节点) 配…

Java面试题-UDP\TCP\HTTP

UDP UDP特性 &#xff08;1&#xff09;UDP是无连接的&#xff1a;发送数据之前不需要像TCP一样建立连接&#xff0c;也不需要释放连接&#xff0c;所以减少了发送和接收数据的开销 &#xff08;2&#xff09;UDP 使用尽最大努力交付&#xff1a;即不保证可靠交付 &#xff0…

Java面向对象(基础)--package和import关键字的使用

文章目录 一、package关键字的使用1. 说明2. 包的作用3. JDK中主要的包 二、import关键字的使用 一、package关键字的使用 1. 说明 package:包package用于指明该文件中定义的类、接口等结构所在的包。语法格式 举例&#xff1a;pack1\pack2\PackageTest.java package pack1.…