代码重构 【Github Actions】

This commit is contained in:
github-actions[bot]
2021-07-23 15:44:19 +00:00
parent c79cac3d9c
commit f671c90754
94 changed files with 1609 additions and 2111 deletions

View File

@@ -1,26 +1,26 @@
# 计数排序
> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
今天我们就一起来看看线性排序里的计数排序到底是怎么回事吧
我们将镜头切到袁记菜馆
因为今年袁记菜馆的效益不错所以袁厨就想给员工发些小福利让小二根据员工工龄进行排序但是菜馆共有 100000 名员工菜馆开业 10 员工工龄从 0 - 10 不等看来这真是一个艰巨的任务啊
因为今年袁记菜馆的效益不错所以袁厨就想给员工发些小福利让小二根据员工工龄进行排序但是菜馆共有 100000 名员工菜馆开业 10 员工工龄从 0 - 10 不等看来这真是一个艰巨的任务啊
当然我们可以借助之前说过的 归并排序 快速排序解决但是我们有没有其他更好的方法呢
了解排序算法的老哥可能已经猜到今天写什么啦是滴我们今天来写写用空间换时间的线性排序
说之前我们先来回顾一下之前的排序算法最好的时间复杂度为 O(nlogn) ,且都基于元素之间的比较来进行排序
说之前我们先来回顾一下之前的排序算法最好的时间复杂度为 O(nlogn) ,且都基于元素之间的比较来进行排序
我们来说一下非基于元素比较的排序算法且时间复杂度为 On时间复杂度是线性的所以我们称其为线性排序算法
其优势在于在对一定范围内的整数排序时它的复杂度为Ο(n+k)此时的 k 则代表整数的范围快于任何一种比较类排序算法不过也是需要牺牲一些空间来换取时间
其优势在于在对一定范围内的整数排序时它的复杂度为 Ο(n+k)此时的 k 则代表整数的范围快于任何一种比较类排序算法不过也是需要牺牲一些空间来换取时间
下面我们先来看看什么是计数排序这个计数的含义是什么
@@ -50,10 +50,6 @@
![微信截图_20210327202256](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/微信截图_20210327202256.7g3nka7n0p40.png)
虽然喵哥和杰哥工龄相同如果我们按照上面的操作输出之后我们不能知道工龄为 4 的两个员工哪个是喵哥哪个是杰哥
所以我们需要借助其他方法来对元素进行排序
@@ -62,13 +58,9 @@
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/微信截图_20210328131226.3x42hsrnna80.png)
因为我们是通过统计次数的数组得到了前缀和数组那么我们来分析一下 presum 数组里面值的含义
例如我们的 presum[2] = 5 ,代表的则是原数组小于等于 2 的值共有 5 presum[4] = 7 代表小于等于 4 的元素共有 7
例如我们的 presum[2] = 5 ,代表的则是原数组小于等于 2 的值共有 5 presum[4] = 7 代表小于等于 4 的元素共有 7
是不是感觉计数排序的含义要慢慢显现出来啦
@@ -88,7 +80,7 @@
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/微信截图_20210328133401.23fulpjowbnk.png)
我们继续查询 presum 数组发现 presum[5] = 9,则说明小于等于 5 的数共有 9 我们将其放入到 temp 数组的第 9 个位置也就是
我们继续查询 presum 数组发现 presum[5] = 9,则说明小于等于 5 的数共有 9 我们将其放入到 temp 数组的第 9 个位置也就是
temp[8] = 5然后再将 presum[5] 1
@@ -106,7 +98,7 @@ temp[8] = 5。然后再将 presum[5] 减 1 。
但是到现在就完了吗显然没有我们思考下这个情况
假如我们的数字为 9093949192 如果我们根据上面方法设置 presum 数组的长度那我们则需要设置数组长度为 95因为最大值是94这样显然是不合理的会浪费掉很多空间
假如我们的数字为 9093949192 如果我们根据上面方法设置 presum 数组的长度那我们则需要设置数组长度为 95因为最大值是 94这样显然是不合理的会浪费掉很多空间
还有就是当我们需要对负数进行排序时同样会出现问题因为我们求次数的时候是根据 nums[index] 的值来填充 presum 数组的所以当 nums[index] 为负数时填充 presum 数组时则会报错而且此时通过最大值来定义数组长度也不合理
@@ -114,7 +106,7 @@ temp[8] = 5。然后再将 presum[5] 减 1 。
下面我们来说一下偏移量的概念
例如 9093949192我们 可以通过 max min 的值来设置数组长度即 94 - 90 + 1 = 5 偏移量则为 min 也就是 90
例如 9093949192我们 可以通过 max min 的值来设置数组长度即 94 - 90 + 1 = 5 偏移量则为 min 也就是 90
见下图
@@ -133,7 +125,7 @@ Java Code:
```java
class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
if (nums.length < 1) {
return nums;
@@ -142,8 +134,8 @@ class Solution {
int max = nums[0];
int min = nums[0];
for (int x : nums) {
if (max < x) max = x;
if (min > x) min = x;
if (max < x) max = x;
if (min > x) min = x;
}
//设置 presum 数组长度,然后求出我们的前缀和数组,
//这里我们可以把求次数数组和前缀和数组用一个数组处理
@@ -152,7 +144,7 @@ class Solution {
presum[x-min]++;
}
for (int i = 1; i < presum.length; ++i) {
presum[i] = presum[i-1]+presum[i];
presum[i] = presum[i-1]+presum[i];
}
//临时数组
int[] temp = new int[len];
@@ -162,7 +154,7 @@ class Solution {
int index = presum[nums[i]-min]-1;
temp[index] = nums[i];
//相应位置减一
presum[nums[i]-min]--;
presum[nums[i]-min]--;
}
//copy回原数组
System.arraycopy(temp,0,nums,0,len);
@@ -174,7 +166,7 @@ class Solution {
Python Code:
```python
from typing import List
from typing import List
class Solution:
def sortArray(self,nums: List[int])->List[int]:
leng = len(nums)
@@ -230,4 +222,3 @@ class Solution:
- 当待排序的元素非整数时,也不适用,大家思考一下这是为什么呢?
好啦,今天的文章就到这啦,我们下期再见,拜了个拜.