十大经典排序算法动画与解析

2023-11-01

排序算法是《数据结构与算法》中最基本的算法之一。

 

排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

 

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。

 

用一张图概括:

关于时间复杂度:

  1. 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序;

  2. 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;

  3. O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序;

  4. 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。

关于稳定性:

  1. 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序;

  2. 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

一、冒泡排序

1.1 算法步骤

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

  • 针对所有的元素重复以上的步骤,除了最后一个。

  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

1.2 动画演示

冒泡排序动画演示

1.3 参考代码

1// Java 代码实现
2public class BubbleSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        // 对 arr 进行拷贝,不改变参数内容
7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
8
9        for (int i = 1; i < arr.length; i++) {
10            // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
11            boolean flag = true;
12
13            for (int j = 0; j < arr.length - i; j++) {
14                if (arr[j] > arr[j + 1]) {
15                    int tmp = arr[j];
16                    arr[j] = arr[j + 1];
17                    arr[j + 1] = tmp;
18
19                    flag = false;
20                }
21            }
22
23            if (flag) {
24                break;
25            }
26        }
27        return arr;
28    }
29}

 

二、选择排序

2.1 算法步骤

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

  • 重复第二步,直到所有元素均排序完毕。

2.2 动画演示

选择排序动画演示

2.3 参考代码

1//Java 代码实现
2public class SelectionSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
7
8        // 总共要经过 N-1 轮比较
9        for (int i = 0; i < arr.length - 1; i++) {
10            int min = i;
11
12            // 每轮需要比较的次数 N-i
13            for (int j = i + 1; j < arr.length; j++) {
14                if (arr[j] < arr[min]) {
15                    // 记录目前能找到的最小值元素的下标
16                    min = j;
17                }
18            }
19
20            // 将找到的最小值和i位置所在的值进行交换
21            if (i != min) {
22                int tmp = arr[i];
23                arr[i] = arr[min];
24                arr[min] = tmp;
25            }
26
27        }
28        return arr;
29    }
30}

 

三、插入排序

3.1 算法步骤

  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

3.2 动画演示

插入排序动画演示

3.3 参考代码

1//Java 代码实现
2public class InsertSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        // 对 arr 进行拷贝,不改变参数内容
7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
8
9        // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
10        for (int i = 1; i < arr.length; i++) {
11
12            // 记录要插入的数据
13            int tmp = arr[i];
14
15            // 从已经排序的序列最右边的开始比较,找到比其小的数
16            int j = i;
17            while (j > 0 && tmp < arr[j - 1]) {
18                arr[j] = arr[j - 1];
19                j--;
20            }
21
22            // 存在比其小的数,插入
23            if (j != i) {
24                arr[j] = tmp;
25            }
26
27        }
28        return arr;
29    }
30}

 

四、希尔排序

4.1 算法步骤

  • 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

  • 按增量序列个数 k,对序列进行 k 趟排序;

  • 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

4.2 动画演示

希尔排序动画演示

4.3 参考代码

1//Java 代码实现
2public class ShellSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        // 对 arr 进行拷贝,不改变参数内容
7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
8
9        int gap = 1;
10        while (gap < arr.length) {
11            gap = gap * 3 + 1;
12        }
13
14        while (gap > 0) {
15            for (int i = gap; i < arr.length; i++) {
16                int tmp = arr[i];
17                int j = i - gap;
18                while (j >= 0 && arr[j] > tmp) {
19                    arr[j + gap] = arr[j];
20                    j -= gap;
21                }
22                arr[j + gap] = tmp;
23            }
24            gap = (int) Math.floor(gap / 3);
25        }
26
27        return arr;
28    }
29}

 

五、归并排序

5.1 算法步骤

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

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

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

  • 重复步骤 3 直到某一指针达到序列尾;

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

5.2 动画演示

归并排序动画演示

5.3 参考代码

1//Java 代码实现
    public class MergeSort implements IArraySort {
2
3    @Override
4    public int[] sort(int[] sourceArray) throws Exception {
5        // 对 arr 进行拷贝,不改变参数内容
6        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
7
8        if (arr.length < 2) {
9            return arr;
10        }
11        int middle = (int) Math.floor(arr.length / 2);
12
13        int[] left = Arrays.copyOfRange(arr, 0, middle);
14        int[] right = Arrays.copyOfRange(arr, middle, arr.length);
15
16        return merge(sort(left), sort(right));
17    }
18
19    protected int[] merge(int[] left, int[] right) {
20        int[] result = new int[left.length + right.length];
21        int i = 0;
22        while (left.length > 0 && right.length > 0) {
23            if (left[0] <= right[0]) {
24                result[i++] = left[0];
25                left = Arrays.copyOfRange(left, 1, left.length);
26            } else {
27                result[i++] = right[0];
28                right = Arrays.copyOfRange(right, 1, right.length);
29            }
30        }
31
32        while (left.length > 0) {
33            result[i++] = left[0];
34            left = Arrays.copyOfRange(left, 1, left.length);
35        }
36
37        while (right.length > 0) {
38            result[i++] = right[0];
39            right = Arrays.copyOfRange(right, 1, right.length);
40        }
41
42        return result;
43    }
44
45}

 

六、快速排序

算法步骤

  • 从数列中挑出一个元素,称为 “基准”(pivot);

  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

6.2 动画演示

快速排序动画演示

6.3 参考代码

1//Java 代码实现
2public class QuickSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        // 对 arr 进行拷贝,不改变参数内容
7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
8
9        return quickSort(arr, 0, arr.length - 1);
10    }
11
12    private int[] quickSort(int[] arr, int left, int right) {
13        if (left < right) {
14            int partitionIndex = partition(arr, left, right);
15            quickSort(arr, left, partitionIndex - 1);
16            quickSort(arr, partitionIndex + 1, right);
17        }
18        return arr;
19    }
20
21    private int partition(int[] arr, int left, int right) {
22        // 设定基准值(pivot)
23        int pivot = left;
24        int index = pivot + 1;
25        for (int i = index; i <= right; i++) {
26            if (arr[i] < arr[pivot]) {
27                swap(arr, i, index);
28                index++;
29            }
30        }
31        swap(arr, pivot, index - 1);
32        return index - 1;
33    }
34
35    private void swap(int[] arr, int i, int j) {
36        int temp = arr[i];
37        arr[i] = arr[j];
38        arr[j] = temp;
39    }
40
41}

 

七、堆排序

7.1 算法步骤

  • 创建一个堆 H[0……n-1];

  • 把堆首(最大值)和堆尾互换;

  • 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

  • 重复步骤 2,直到堆的尺寸为 1。

7.2 动画演示

                                                                     堆排序动画演示

7.3 参考代码

1//Java 代码实现
2public class HeapSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        // 对 arr 进行拷贝,不改变参数内容
7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
8
9        int len = arr.length;
10
11        buildMaxHeap(arr, len);
12
13        for (int i = len - 1; i > 0; i--) {
14            swap(arr, 0, i);
15            len--;
16            heapify(arr, 0, len);
17        }
18        return arr;
19    }
20
21    private void buildMaxHeap(int[] arr, int len) {
22        for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
23            heapify(arr, i, len);
24        }
25    }
26
27    private void heapify(int[] arr, int i, int len) {
28        int left = 2 * i + 1;
29        int right = 2 * i + 2;
30        int largest = i;
31
32        if (left < len && arr[left] > arr[largest]) {
33            largest = left;
34        }
35
36        if (right < len && arr[right] > arr[largest]) {
37            largest = right;
38        }
39
40        if (largest != i) {
41            swap(arr, i, largest);
42            heapify(arr, largest, len);
43        }
44    }
45
46    private void swap(int[] arr, int i, int j) {
47        int temp = arr[i];
48        arr[i] = arr[j];
49        arr[j] = temp;
50    }
51
52}

 

八、计数排序

8.1 算法步骤

  • 花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max

  • 开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)

  • 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数

  • 最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数

8.2 动画演示

计数排序动画演示

8.3 参考代码

1//Java 代码实现
2public class CountingSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        // 对 arr 进行拷贝,不改变参数内容
7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
8
9        int maxValue = getMaxValue(arr);
10
11        return countingSort(arr, maxValue);
12    }
13
14    private int[] countingSort(int[] arr, int maxValue) {
15        int bucketLen = maxValue + 1;
16        int[] bucket = new int[bucketLen];
17
18        for (int value : arr) {
19            bucket[value]++;
20        }
21
22        int sortedIndex = 0;
23        for (int j = 0; j < bucketLen; j++) {
24            while (bucket[j] > 0) {
25                arr[sortedIndex++] = j;
26                bucket[j]--;
27            }
28        }
29        return arr;
30    }
31
32    private int getMaxValue(int[] arr) {
33        int maxValue = arr[0];
34        for (int value : arr) {
35            if (maxValue < value) {
36                maxValue = value;
37            }
38        }
39        return maxValue;
40    }
41
42}

 

九、桶排序

9.1 算法步骤

  • 设置固定数量的空桶。

  • 把数据放到对应的桶中。

  • 对每个不为空的桶中数据进行排序。

  • 拼接不为空的桶中数据,得到结果

9.2 动画演示

                                                                         桶排序动画演示

 

9.3 参考代码

1//Java 代码实现
2public class BucketSort implements IArraySort {
3
4    private static final InsertSort insertSort = new InsertSort();
5
6    @Override
7    public int[] sort(int[] sourceArray) throws Exception {
8        // 对 arr 进行拷贝,不改变参数内容
9        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
10
11        return bucketSort(arr, 5);
12    }
13
14    private int[] bucketSort(int[] arr, int bucketSize) throws Exception {
15        if (arr.length == 0) {
16            return arr;
17        }
18
19        int minValue = arr[0];
20        int maxValue = arr[0];
21        for (int value : arr) {
22            if (value < minValue) {
23                minValue = value;
24            } else if (value > maxValue) {
25                maxValue = value;
26            }
27        }
28
29        int bucketCount = (int) Math.floor((maxValue - minValue) / bucketSize) + 1;
30        int[][] buckets = new int[bucketCount][0];
31
32        // 利用映射函数将数据分配到各个桶中
33        for (int i = 0; i < arr.length; i++) {
34            int index = (int) Math.floor((arr[i] - minValue) / bucketSize);
35            buckets[index] = arrAppend(buckets[index], arr[i]);
36        }
37
38        int arrIndex = 0;
39        for (int[] bucket : buckets) {
40            if (bucket.length <= 0) {
41                continue;
42            }
43            // 对每个桶进行排序,这里使用了插入排序
44            bucket = insertSort.sort(bucket);
45            for (int value : bucket) {
46                arr[arrIndex++] = value;
47            }
48        }
49
50        return arr;
51    }
52
53    /**
54     * 自动扩容,并保存数据
55     *
56     * @param arr
57     * @param value
58     */
59    private int[] arrAppend(int[] arr, int value) {
60        arr = Arrays.copyOf(arr, arr.length + 1);
61        arr[arr.length - 1] = value;
62        return arr;
63    }
64
65}

 

十、基数排序

10.1 算法步骤

  • 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零

  • 从最低位开始,依次进行一次排序

  • 从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列

10.2 动画演示

                                                                        基数排序动画演示

10.3 参考代码

1//Java 代码实现
2public class RadixSort implements IArraySort {
3
4    @Override
5    public int[] sort(int[] sourceArray) throws Exception {
6        // 对 arr 进行拷贝,不改变参数内容
7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
8
9        int maxDigit = getMaxDigit(arr);
10        return radixSort(arr, maxDigit);
11    }
12
13    /**
14     * 获取最高位数
15     */
16    private int getMaxDigit(int[] arr) {
17        int maxValue = getMaxValue(arr);
18        return getNumLenght(maxValue);
19    }
20
21    private int getMaxValue(int[] arr) {
22        int maxValue = arr[0];
23        for (int value : arr) {
24            if (maxValue < value) {
25                maxValue = value;
26            }
27        }
28        return maxValue;
29    }
30
31    protected int getNumLenght(long num) {
32        if (num == 0) {
33            return 1;
34        }
35        int lenght = 0;
36        for (long temp = num; temp != 0; temp /= 10) {
37            lenght++;
38        }
39        return lenght;
40    }
41
42    private int[] radixSort(int[] arr, int maxDigit) {
43        int mod = 10;
44        int dev = 1;
45
46        for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
47            // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
48            int[][] counter = new int[mod * 2][0];
49
50            for (int j = 0; j < arr.length; j++) {
51                int bucket = ((arr[j] % mod) / dev) + mod;
52                counter[bucket] = arrayAppend(counter[bucket], arr[j]);
53            }
54
55            int pos = 0;
56            for (int[] bucket : counter) {
57                for (int value : bucket) {
58                    arr[pos++] = value;
59                }
60            }
61        }
62
63        return arr;
64    }
65    private int[] arrayAppend(int[] arr, int value) {
66        arr = Arrays.copyOf(arr, arr.length + 1);
67        arr[arr.length - 1] = value;
68        return arr;
69    }
70}

 

本文思路来源于:https://github.com/hustcc/JS-Sorting-Algorithm

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十大经典排序算法动画与解析 的相关文章

  • 那个当年的三本学渣,为啥最后进了大厂?

    自我介绍 我是一名普通的三本大学生 自学开发 相继经历了接外包 创业 合伙人跑路等一系列事情 从一开始对于计算机的一无所知到现在拿到了一线互联网企业的special offer 磕磕碰碰 一路走来 可谓辛酸苦辣 大一小白 我就读的专业偏计算
  • 官宣——BSV工程师能力认证项目在CSDN推出线上学习平台

    去年11月 上海可一澈科技有限公司 以下简称 可一科技 与CSDN联合推出了BSV区块链开发工程师能力认证项目 以下简称 BSV工程师认证 今天 BSV工程师认证项目正式推出一个全新的线上学习平台 并发布首门课程 比特币协议与设计 本次推出
  • ​深度学习引用数最高的十大论文(附论文下载)

    在过去的几年里 作为机器学习和统计学习的子领域 深度学习已经在诸多领域取得了令人印象深刻的突破 鲁棒性的开源工具 云计算以及大量可用的数据是深度学习能够取得成功的重要基石 下面 我们列出十大深度学习论文 1 Deep Learning by
  • @那些想要转行AI的人:送你一份人工智能入门指南

    人工智能是什么 人工智能为何重要 我们应该畏惧人工智能吗 为什么突然之间所有人都在谈论人工智能 你可能会从网上知道人工智能如何为亚马逊和Google的虚拟助理提供支持 或者人工智能如何一步步地取代所有的工作 有争议的 但是这些文章极少很好的
  • C语言这么厉害,它自身又是用什么语言写的?

    作者 码农翻身刘欣 出自 码农翻身 ID coderising 这是来自我的星球的一个提问 C语言本身用什么语言写的 换个角度来问 其实是 C语言在运行之前 得编译才行 那C语言的编译器从哪里来 用什么语言来写的 如果是用C语言本身来写的
  • 超级厉害的汇总图——人工智能之机器学习算法体系

    1 人工智能之机器学习体系汇总 直接上干货 此处梳理出面向人工智能的机器学习方法体系 主要体现机器学习方法和逻辑关系 理清机器学习脉络 后续文章会针对机器学习系列讲解算法原理和实战 抱着一颗严谨学习之心 有不当之处欢迎斧正 2 人工智能相关
  • 最萌算法学习,一秒让程序员及其女友都能学会!

    普通程序员 不学算法 也可以成为大神吗 对不起 这个 绝对不可以 可是算法好难啊 看两页书就想睡觉 所以就不学了吗 就一直当普通程序员吗 如果有一本算法书 看着很轻松 又有代码示例 又有讲解 怎么会有那样的书呢 哎呀 最好学了算法人还能变得
  • 如何写毕业设计——文献综述

    文献综述是一种收集某一特定学科大量信息数据的学术论文 经过综合分析 它是一种学术论文 它是一种科学文献 文献综述反映了某一学科或某一领域重要课题的最新进展 学术见解和建议经常反映有关问题的新发展 新趋势 新水平 新原则和新技术等等 写一篇文
  • AI工程师职业规划指南——中科院大牛告诉你如何成为一名语音识别工程师

    语音识别基础知识 数学与统计学 数学是所有学科的基础 其中的高等数学 数理方程 泛函分析等课程是必要的基础知识 概率论与数理统计也是语音识别的基础学科 声学与语言学 声学基础 理论声学 声学测量等是声学方面的基础课程 有助于了解更多声学领域
  • 十大经典排序算法动画与解析

    排序算法是 数据结构与算法 中最基本的算法之一 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 一次不能容纳全部的排序记录 在排序过程中需要访问外存 常见的内部排序算法有 插入排序 希尔
  • 超5星难度【微软Core allocation】Coding赛题 - 解题思路&优秀代码分享,邀你来“找茬儿”

    6月23日英雄会平台发布了一道难度为超5星的微软比赛题目 截止活动结束共有300多名编程爱好者参与线上答题 而最终通过者仅有7人 通过率仅为2 为什么成绩如此出人意料 是因为原题的英文描述难以理解 还是题目本身的难度太高让很多人望而生畏知难
  • 面试过程中会遇到的机器学习教科书中 7 大经典问题

    如果希望了解机器学习 或者已经决定投身机器学习 你会第一时间找到各种教材进行充电 同时在心中默认 书里讲的是牛人大神的毕生智慧 是正确无误的行动指南 认真学习就能获得快速提升 但实际情况是 你很可能已经在走弯路 科技发展很快 数据在指数级增
  • ES6中数组首尾两端和中间添加/移除数据方法

    1 push 尾端插入 返回数组长度 let arr 1 hello true console log arr push 22 4 console log arr arr 1 hello true 22 console log arr pu
  • 用python画个佩奇来瞧瞧

    闲来无事 用turtle画了个小猪佩奇 代码其实很简单的 就是烦了点 没必要每行代码都发出来 给大家看几个主要的函数好了 另外我给绝大多数代码都加上了注释 相同的代码我就不加了 首先需要初始化画笔的一些属性 包括颜色 画笔的画画速度等 de
  • AI技术进阶的75道面试题

    本文转载自AI科技大本营 整理 AI科技大本营 出品 AI科技大本营 公众号id rgznai100 导语 正值求职 跳槽季 无论你是换工作还是找实习 没有真本事都是万万不行的 可是如何高效率复习呢 之前我们给大家推荐了一份 Python
  • 南大和中大“合体”拯救手残党:基于GAN的PI-REC重构网络,终于有救了

    对于喜欢画画的你来说 总是画得七零八落 不堪入目 但现在 有一种方法可以让你像专业人士那样 让你的糟糕画作变成一副完美的作品 南京大学和中山大学的三位研究人员发布的最新论文中 提出了一种具有边缘和色域的渐进式图像重构网络 PI REC 这是
  • 一个好玩的编程小游戏—— 母牛生小牛

    题目 母牛从3 7岁初每年会生产1头小母牛 10岁后死亡 10岁任然存活 假设初始有一头刚出生的母牛 请问第n年有多少头母牛 年从第一年开始计数 注 第三年初会出生 第一头母牛 故第三年有两头母牛 第五年初 第三年出生的母牛会生产 故第五年
  • 如何成为一名合格的互联网大厂Python工程师?

    Python开发工程师 是一个在IT行业圈子里一直都很热门的话题 无论是像腾讯 百度这样的大型公司 还是刚刚起步的初创公司 都会招python开发工程师 python已成为越来越多开发者的开发语言选择 而python开发工程师工资基本上都高
  • 一个好玩的小游戏——麻神之战

    题目 一种新的麻将 只留下一种花色 并且除去了一些特殊和牌方式 例如七对子等 规则如下 共有36张牌 每张牌是1 9 每个数字4张牌 你手里有其中的14张牌 如果这14张牌满足如下条件 即算作和牌 14张牌中有2张相同数字的牌 称为雀头 除
  • 原动力×云原生正发声 降本增效大讲堂

    原动力 云原生正发声 降本增效大讲堂课程活动链接 原动力 云原生正发声 降本增效大讲堂 提升IT资源利用率 实现降本增效 已经成为企业关注重点 2021 年 CNCF FinOps Kubernetes Report 指出 迁移至 Kube

随机推荐

  • Hadoop三种运行模式详解

    5 1 本地运行模式 本地运行模式不需要额外的设置 只需要执行响应的jar包就可以了 不需要任何的集群配置 本地运行模式其实也是一种单节点模式 Hadoop提供了两个案例 我们执行这两个案例 5 1 1 官方 grep 案例 这个案例是提供
  • Fast Global Registration 快速全局配准

    目录 1 算法过程 2 基于四元约束关系集的生成 3 基于关系集目标函数的构建 4 目标函数的优化 本文出自CSDN点云侠 爬虫自重 把自己当个人 1 算法过程 Fast Global Registration算法利用四元约束剔除匹配的关系
  • 字符串去掉小数点后取整数

    字符串去掉小数点后取整数 String str 70 2 if str contains int indexOf str indexOf str str substring 0 indexOf int matchRateInt Intege
  • VS 项目中查找中文正则表达式

    u4E00 u9FA5 u4E00 u9FA5 直接在VS中用Ctrl F或者Ctrl Shift F 在 查找内容 中输入 u4E00 u9FA5 u4E00 u9FA5 然后在 查找选项 使用正则表达式 打钩 就能找出所有这些中文字符串
  • ios gzip 压缩字符串

    1 import zlib h 2 libz 1 2 5 tbd 3 NSData gzipDeflate NSString str NSData data str dataUsingEncoding NSUTF8StringEncodin
  • CeiT阅读笔记

    CeiT Incorporating Convolution Designs into Visual Transformer 纯Transformer架构通常需要大量的训练数据和额外的监督才能获得与卷积神经网络CNNs相当的性能 为了克服这
  • Docker容器访问宿主机网络

    业务请求量小的时候 我们会把一些工程部署到同一台机器上 这些工程之间也会相互访问 如果是http的接口 我们最方便的是使用localhost带地本机的ip 不过结合docker容器后出现了问题 docker容器中localhost表示容器的
  • IDEA项目实践——JavaWeb简介以及Servlet编程实战

    系列文章目录 IDEA项目实践 创建Java项目以及创建Maven项目案例 使用数据库连接池创建项目简介 IDEWA项目实践 mybatis的一些基本原理以及案例 IDEA项目实践 动态SQL 关系映射 注解开发 IDEA项目实践 Spri
  • C# 系统应用之清除Cookies、IE临时文件、历史记录

    本文主要是项目 个人电脑使用记录清除软件 系类文章中关于清除浏览器Cookies IE临时文件 最近使用历史记录等内容 该篇文章的基本思想路线是首先了解上网历史记录的Windows中常用文件路径 再通过文件delete方法删除该文件下内容
  • leetcode86 分割链表

    题目 给你一个链表的头节点 head 和一个特定值 x 请你对链表进行分隔 使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前 你应当 保留 两个分区中每个节点的初始相对位置 示例 输入 head 1 4 3 2 5 2 x 3
  • LeetCode-216-组合总和Ⅱ

    题目链接 LeetCode 216 组合总和 解题思路 回溯算法 注意事项注释中有 代码实现 class Solution 和为 n 个数为 k 求的是组合 不要求顺序 递归的深度是 k public List
  • 2019.9.4 key-value stores 和 timestamps

    这一章先是将key value stores 其实这个就是对应的关系型数据库的以schema为基础的存储原理 一般的nosql就是用的这种 特点就是没有什么明显的schema 除了key以外就是一大坨的value 不需要有什么整齐的格式 讲
  • Leetcode刷题笔记:二叉树篇(下)

    1 Leetcode 110 平衡二叉树 难度 递归 迭代 给定一个二叉树 判断它是否是高度平衡的二叉树 本题中 一棵高度平衡二叉树定义为 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1 示例 1 给定二叉树 3 9 20 nu
  • Java类文件结构、Java类加载过程、类加载器(双亲委派模型)、Java对象实例化过程

    1 类文件结构 根据 Java 虚拟机规范 类文件由单个 ClassFile 结构组成 ClassFile u4 magic Class 文件的标志 u2 minor version Class 的小版本号 u2 major version
  • 【银河麒麟V10】【服务器】系统负载分析

    一 cpu负载 1 CPU基本概念 1 1 什么是物理cpu个数 物理cpu个数即主板上实际能够看到的cpu个数 也是cpu插槽数 1 2 什么是cpu核数 cpu核数指的是物理cpu个数 每个物理cpu的核心数 因为每个物理cpu可能包含
  • 深度学习笔记(八):目标检测性能评价指标(mAP、IOU..)

    一 mAP 这里首先介绍几个常见的模型评价术语 现在假设我们的分类目标只有两类 计为正例 positive 和负例 negtive 分别是 1 True positives TP 被正确地划分为正例的个数 即实际为正例且被分类器划分为正例的
  • iptables 规则管理

    参考 http www zsythink net archives 1517 有两台测试机 zk02 192 168 27 152 zk03 192 168 27 153 目录 1 增加规则 2 追加规则 1 增加规则 首先看一条命令 表示
  • C/C++

    文章目录 2 3 C语言内存空间的使用 数组 数组的定义及初始化 数组空间的初始化 空间的第一次赋值 和逐一赋值是一样的 代表空间的限制块 char strcpy 工程禁用 strncpy 推荐 非字符串空间 memcpy 指针与数组 指针
  • Genlovy_Hoo大神的杰作

    转 支持向量机学习笔记 支持向量机学习笔记 呕心沥血整理的SVM学习笔记 完整总结了SVM的思想和整个求解过程 里面有诸多本人在学习过程中的想法 希望对初学者有帮助 pdf下载地址 http download csdn net detail
  • 十大经典排序算法动画与解析

    排序算法是 数据结构与算法 中最基本的算法之一 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 一次不能容纳全部的排序记录 在排序过程中需要访问外存 常见的内部排序算法有 插入排序 希尔