十大经典排序算法动画与解析,看我就够了
作者 | 程序员小吴
转载自五分钟学算法(ID: CXYxiaowu)
排序算法是《数据结构与算法》中最基本的算法之一。
排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。
用一张图概括:

时间复杂度与空间复杂度
关于时间复杂度:
平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序;
线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;
O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序;
线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。
关于稳定性:
稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序;
不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。
一、冒泡排序
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
(本文为 AI科技大本营转载文章,转载请微信联系原作者)
群招募
扫码添加小助手微信,回复:公司+研究方向(学校+研究方向),邀你加入技术交流群。技术群审核较严,敬请谅解。
推荐阅读:
优秀开发者必备技能包:Python调试器
十大经典排序算法动画与解析,看我就够了
访问量最高超7百万的Stack Overflow问题竟然是...
新鲜开源:基于TF2.0的深度强化学习平台
交易机器人春天已来?先看完这篇再说吧
程序员求职新思路:互联网巨鳄瓜分 ToB 资源全公开
移动开发还有未来吗?
全面剖析企业私有云
月入5万,程序员夫人们过上"贵妇"生活了吗?
点击“阅读原文”,查看历史精彩文章。
相关文章:

Crystal Reports 财务日记帐凭证套打设计
Crystal Reports 财务日记帐凭证套打设计 一、首先大家看下财务日记帐凭证的纸张格式: 下面我们来分析下有几点要素:1、每页显示5行记录,2、就是在合计处的中文金额大写了。其他页眉页脚在水晶报表中很容易设计。 二、报表设计:在…

oozie调度中的重试和手工rerun一个workflow
在oozie中有Bundle、Coordinator和Workflow三种类型的job,他们之间可以有以下包含关系。 Bundle > Coordinator > Workflow。 1. 重新运行一个Coordinator job,可以通过如下命令: oozie job -rerun 0000034-180116183039102-oozie-hado…

【Qt】在Qlayout中Qlabel::setScaledContents(true);失效
Qlabel中添加图片,并使图片自适应Qlabel的大小 QPixmap picture;picture.load("./1.jpg");ui->label->setScaledContents(true);//图片自适应label大小ui->label->setPixmap(picture); 在layout中Qlabel::setScaledContents(true);失效 解决办法,set…

JavaScript写XML
引用地址:http://zhidao.baidu.com/question/76344574.html?frala0 load 方法 作 用表示从指定位置加载的文件。 基本语法boolValue = xmlDocument.load(url);说 明url 包含要被加载档案的URL 的字符串。假如文件加载成功,传回值即为t…

在家想远程公司电脑?Python +微信一键连接
作者 | 阿文转载自 CSDN(ID:CSDNnews)有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器。准备工作本程序主要是实现远程管理…

Python 语法相关知识
系统相关的信息模块: import syssys.argv 是一个 list,包含所有的命令行参数. sys.stdout sys.stdin sys.stderr 分别表示标准输入输出,错误输出的文件对象. sys.stdin.readline() 从标准输入读一行 sys.stdout.write("a") 屏幕输出a sys.exit(exit_code) 退出程序 s…

【Qt】 error: LNK1107: 文件无效或损坏: 无法在 0x310 处读取
编译Qt程序使用动态库时,报错 error: LNK1107: 文件无效或损坏: 无法在 0x310 处读取 原因 链接时,使用的dll,而不是lib。 lib是编译时需要的,dll是运行时需要的。 windows下动态库和静态库 动态库:生成动态库时…

Red5安装与入门 与FMS配置
转自:http://www.rosoo.net/a/Media/Streaming/201010/10343.html red5安装时出现问题解决:http://www.cnblogs.com/phinecos/archive/2007/11/26/973109.htmlred5安装设置: 首先需要安装Red5运行所需的java研发环境jdk,我所有的文件都保存到…

面试必备|带你彻底搞懂Python生成器
2019年人工智能系统学: https://edu.csdn.net/topic/ai30?utm_sourceai100_bw 作者 | Rocky0429 转载自 Python空间(ID:Devtogether) 写在之前 Python 的高级语言特性一直是我们学习 Python 的一个难点,大部分人并没有做到熟练的…

Kubecon 2017大会Google高级产品经理David Aronchick访谈:机器学习和Kubernetes
\看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料!\\\在德克萨斯州奥斯汀市举办的Kubecon大会已于近日闭幕,会议吸引了超过4000名工程师,Kubernetes成为了…

【Qt】Qt程序查看动态链接库(windows)
windows下使用dumpbin查看Qt程序运行时需要链接的动态库 打开终端 打开Qt自带的MSVC终端 如:Qt 5.10.0 64-bit forDesktop(MSVC 2017) 查看dumpbin命令 dumpbin微软官网说明 https://docs.microsoft.com/zh-cn/cpp/build/reference/dumpbin-options 直接输入命令dumpbin…

MSN 无法登录 错误代码 8007007e
故障原因: 发生这个错误的原因是一些朋友在网上下载了独立MSN提取包版本进行安装的,因为这个提取包只包含了Windows Live Messenger 2009,却缺少Windows Live Communications Platform,所以造成无法登录的问题。 解决办法…

你不知道的Vue响应式原理
文章首发于github Blog。 本文根据Vue源码v2.x进行分析。这里只梳理最源码中最主要的部分,略过非核心的一些部分。响应式更新主要涉及到Watcher,Dep,Observer这几个主要类。 本文主要弄清楚以下几个容易搞混的问题: Watcher&#…

优秀开发者必备技能包:Python调试器
作者 | Roky0429 来源 | Python空间(ID:Devtogether) 人工智能的现状及今后发展趋势如何? https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 写在之前 不管是之前搞 acm 用 c/c 写算法还是后来用 Python 写代码,我发现在程…

【Qt】dumpbin详解
dumpbin简介 DUMPBIN是在Windows平台下用于显示COFF格式文件信息的一个命令行工具。你可以使用DUMPBIN去显示COFF格式的文件信息,比如像vc编译器生成的目标文件(obj),可执行文件(exe)和动态链接库…

感悟Windows7
Win7已经逐渐在中国电脑用户中普遍起来,绝大多数人对其新增的功能很升级的功能都很是好评,接下来就将简略总结一下我对此系统使用的一些感想。 l 界面更加体现以人为本的思想。更加赏心悦目并且选择更加多元化。比如桌面小工具就有了更多的选择并且还可…

【Qt】Qt5在ubuntu16.04无法输入中文解决方式
参考博客 https://blog.csdn.net/linux_2016/article/details/52356576 博客中没有修改库的执行权限 解决方法 安装:fcitx-frontend-qt5 sudo apt-get install fcitx-frontend-qt5 拷贝动态库到Qt安装目录下的两个目录中 cp /usr/lib/x86_64-linux-gnu/qt5/p…

拿下中科大的计算机课程全靠它了!
整理 | 琥珀 出品 | AI科技大本营(ID: rgznai100) 人工智能的现状及今后发展趋势如何? https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 中国科学技术大学,简称“中科大”,是国内有名的 985、211 重点高校。近年…

【阿里Q3财报:阿里云去年营收破百亿,亚洲市场遥遥领先】
2月1号晚间,阿里巴巴公布2018财年第三季度财报,阿里云保持持续强劲的增长,季度营收同比增长104%到35.99亿元。2017年累计营收突破百亿,达112亿,这是国内首次出现百亿规模的云计算服务商,在亚洲市场遥遥领先…

“神仙”打架,“凡人”遭殃
神仙是啥?古时神话时代举手翻江倒海的人物啊,那神仙打架是啥后果,相信大家心里都有个底吧。那现代社会的“神仙”是啥?那就是有钱有权的大人物或者商家,那真是让咱仰望的对象啊~ 话说最近这360跟QQ的巅峰对决&am…

120种小狗图像傻傻分不清?用fastai训练一个分类器
作者:一杯奶茶的功夫 链接:https://www.jianshu.com/p/ab35ed21df87 程序员转行学什么语言? https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 这篇文章会讲解如何制作能够分类120种小狗的图像分类器。 这篇文章中所讲述的内容都是基于…

View_01_LayoutInflater的原理、使用方法
View_01_LayoutInflater的原理、使用方法 本篇博客是郭神博客Android视图状态及重绘流程分析,带你一步步深入了解View(一)的读书笔记的笔记。 LayoutInflater简单介绍 setContentView()内部是使用LayoutInflater来完毕载入布局的。setContent…

【ubuntu】在ubuntu下无法输出拼音输入法中的中括号“【” 和 “】”的解决方法
问题 在新装的ubuntu16.04中,打不出中括号【】,而变成 “”和“「” 解决方法 修改文件/usr/share/fcitx/data/punc.mb.zh_CN sudo vi /usr/share/fcitx/data/punc.mb.zh_CN将18、19行改为如下内容 18 [ 【 19 ] 】

配置数据源和分页
1.tomcat的版本,最好不要是安装版的,要解压缩的,不然无法连接数据源。2.conf》context.xml<Resource name"hotel" auth"Container" type"javax.sql.DataSource" driverClassName"oracle.jdbc.…

售价1万7的华为Mate X很贵吗?
整理 | 琥珀 出品 | AI科技大本营(ID: rgznai100) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 继三星之后,网友们期待已久的华为终于忍不住宣布了一系列重磅消息ÿ…

【C】数组数组初始化总结
C数组初始化总结 发现一个新方法,可以分段初始化数组 eg:int arrayC[MAX_LEN] {[1 … 5]9, [6 … 9] 8}; 代码如下 #include <stdio.h> #define MAX_LEN 10int main (int argc, char *argv[]) { //不初始化,参数值随机分配 //[0][0…

Golang的反射reflect深入理解和示例
[TOC] Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representati…

如何读取多个文件,文件后缀名不一致,不过类似source.1 source.2 source.3等
#include <stdio.h> #include <stdlib.h> //为了使用exit() char *itoa(int num,char *str,int radix); int main() { int ch; FILE* fp; // char fname[50]"scan1.source.2100"; //用于存放文件名 char fname[20]"source."; …

AtCoder Petrozavodsk Contest 001
第一场apc,5H的持久战,我当然水几个题就睡了 A - Two Integers Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement You are given positive integers X and Y. If there exists a positive integer not greater than 1018…

【Qt】使用QCamera获取摄像头,并使用图像视图框架QGraphics*来显示
代码下载 https://download.csdn.net/download/u010168781/10373174 #####头文件 #ifndef CAMERATEST_H#define CAMERATEST_H#include <QMainWindow> #include <QGraphicsView> #include <QKeyEvent> #include <QTimer>namespace Ui { class Camera…