提交 33fcb776 编写于 作者: W wizardforcel

2020-06-12 11:23:11

上级 721dcbec
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/algorithm/bubble-sort-java-example/](https://howtodoinjava.com/algorithm/bubble-sort-java-example/)
**冒泡排序**是一种简单而缓慢的排序算法,它会反复浏览整个集合,比较每对相邻元素,并以错误的顺序交换它们。 在排序算法中,如果您观察元素以较高顺序(即较大的值)移动,它们就像水中的气泡,从底部到顶部(从 wrray 的一侧/中间到另一侧)缓慢漂浮。 数组)
**冒泡排序**是一种简单而缓慢的排序算法,它会反复浏览整个集合,比较每对相邻元素,并以错误的顺序交换它们。 在排序算法中,如果您观察元素以较高顺序(即较大的值)移动,它们就像水中的气泡,从底部到顶部(从数组的一侧/中间到另一侧)缓慢漂浮
您可以想象在每一步上都有大气泡漂浮并停留在表面。 在该步骤中,当没有气泡移动时,排序停止。
......@@ -16,7 +16,7 @@
![Bubble sort algorithm](img/a948d64e155b08a5e07cf6bf1c93b676.png)
Bubble sort algorithm
冒泡排序算法
......@@ -67,11 +67,11 @@ Output: [3, 6, 10, 12, 13, 24, 70, 90]
## 冒泡排序性能和复杂性
1. 冒泡排序属于 O(n2)排序算法,这使得排序大型数据量效率很低。
2. 冒泡排序既是 [**稳定的**](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability) ,又是 [**自适应**](https://en.wikipedia.org/wiki/Adaptive_sort)
3. 对于几乎排序的数据,冒泡排序需要 O(n)时间,但至少需要 2 次通过数据。
1. 冒泡排序属于` O(n^2)`排序算法,这使得排序大型数据量效率很低。
2. 冒泡排序既是[**稳定的**](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability),又是[**自适应**](https://en.wikipedia.org/wiki/Adaptive_sort)
3. 对于几乎排序的数据,冒泡排序需要`O(n)`时间,但至少需要 2 次通过数据。
4. 如果输入通常是按排序顺序,但偶尔可能有一些乱序的元素几乎在适当的位置,则这是可行的。
5. 在大量收集的情况下,应避免冒泡排序。
5. 在大型集合的情况下,应避免冒泡排序。
6. 在逆序集合的情况下,效率不高。
学习愉快!
\ No newline at end of file
......@@ -17,12 +17,12 @@
## 插入排序优势
尽管插入排序显然比 [**归并排序**](//howtodoinjava.com/algorithm/merge-sort-java-example/) 等其他排序算法要慢,但是在某些情况下它具有一些良好的优点:
尽管插入排序显然比[**归并排序**](//howtodoinjava.com/algorithm/merge-sort-java-example/)等其他排序算法要慢,但是在某些情况下它具有一些良好的优点:
* 对小型数据输入集有效
* 它是**自适应**,即对于已基本排序的数据集有效
* **稳定**; 即不使用相同的键更改元素的相对顺序
* 在线**; 即可以对列表进行排序**
* 在线; 即可以对列表进行排序
## 插入排序 Java 实现
......@@ -67,7 +67,7 @@ Output: [3, 6, 10, 12, 13, 24, 70, 90]
如果查看以前的实现,则可以轻松地确定遍历数组以在已排序的数组中找到正确的位置,这似乎是大多数时间的任务,可以使用更快速的搜索算法轻松地对其进行改进。
正如我们看到的那样,数组已经排序,因此我们可以采用**二进制搜索算法**,该算法对于已排序的数组更有效。 因此,我们的`improved insertion sort algorithm`将变为:
正如我们看到的那样,数组已经排序,因此我们可以采用**二分搜索算法**,该算法对于已排序的数组更有效。 因此,我们的改进的插入排序算法将变为:
```java
public class InsertionSortExample
......
......@@ -2,15 +2,15 @@
> 原文: [https://howtodoinjava.com/algorithm/merge-sort-java-example/](https://howtodoinjava.com/algorithm/merge-sort-java-example/)
在计算机科学中,**归并排序**(也通常称为拼写归并排序)是一种基于 **O(n log n)**比较的排序算法。 大多数实现都会产生[稳定排序](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability),这意味着该实现会在排序后的输出中保留相等元素的输入顺序。 **Mergesort 是一种分而治之的算法。** 分而治之算法将原始数据分为较小的数据集以解决该问题。
在计算机科学中,**归并排序**(也通常称为拼写归并排序)是一种基于`O(n log n)`比较的排序算法。 大多数实现都会产生[稳定排序](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability),这意味着该实现会在排序后的输出中保留相等元素的输入顺序。 **归并排序是一种分而治之的算法。** 分而治之算法将原始数据分为较小的数据集以解决该问题。
在归并排序过程中,集合中的对象分为两个集合。 要拆分集合,Mergesort 将采用集合的中间部分并将其拆分为左侧和右侧。 通过 Mergesort 算法将生成的集合再次递归拆分,直到将其分解为每个集合中的单个元素为止。
在归并排序过程中,集合中的对象分为两个集合。 要拆分集合,归并排序将采用集合的中间部分并将其拆分为左侧和右侧。 通过归并排序算法将生成的集合再次递归拆分,直到将其分解为每个集合中的单个元素为止。
分割每个集合后,mergesort 算法开始组合通过上述过程获得的所有集合。 为了合并两个集合,Mergesort 从每个集合的开头开始。 它选择较小的对象,然后将该对象插入新集合中。 对于此集合,它现在通过一次比较每个集合中的一个元素,来选择下一个元素,并从两个集合中选择较小的元素。
分割每个集合后,归并排序算法开始组合通过上述过程获得的所有集合。 为了合并两个集合,归并排序从每个集合的开头开始。 它选择较小的对象,然后将该对象插入新集合中。 对于此集合,它现在通过一次比较每个集合中的一个元素,来选择下一个元素,并从两个集合中选择较小的元素。
此过程将创建一个已排序元素的集合(所有需要排序的元素的子集)。 对于在第一步中获得的所有可用集合,即对集合进行拆分,将以递归方式完成此过程。
将两个集合中的所有元素都插入新集合后,Mergesort 已成功对集合进行了排序。
将两个集合中的所有元素都插入新集合后,归并排序已成功对集合进行了排序。
为了避免创建太多集合,通常只创建一个新集合,而将新集合和现有集合视为不同的集合。
......@@ -18,7 +18,7 @@
![Merge sort algorithm](img/f9fb0b2a244e9220465a4cabe3956fe6.png)
Merge sort algorithm
归并排序算法
......@@ -120,13 +120,13 @@ Output Array : [ 1, 3, 5, 12, 13, 16, 50, 66, 333, 897, 1000 ]
## 何时使用归并排序
1. Merge sort is used when the data structure doesn’t support random access, since it works with pure sequential access (forward iterators, rather than random access iterators). It’s also widely used for external sorting, where random access can be very, very expensive compared to sequential access.
1. 当数据结构不支持随机访问时使用归并排序,因为它可以与纯顺序访问(正向迭代器,而不是随机访问迭代器)一起使用。 它也广泛用于外部排序,与顺序访问相比,随机访问的费用非常高。
例如,当对不适合内存的文件进行排序时,您可以将其分成适合内存的块,单独使用对它们进行排序,将每个数据写入文件,然后合并对生成的文件进行排序。
2. 另外,当您需要稳定排序时,可以使用归并排序。 这是归并排序的非常重要的功能。
3. 当处理链接列表时,Mergesort 更快。 这是因为合并列表时可以轻松更改指针。 它只需要遍历列表一次(O(n))。
4. 如果发生大量并行化,则 Mergesort 并行化要比其他排序算法简单。
3. 当处理链接列表时,归并排序更快。 这是因为合并列表时可以轻松更改指针。 它只需要遍历列表一次(O(n))。
4. 如果发生大量并行化,则归并排序并行化要比其他排序算法简单。
这就是关于归并排序 Java 教程的全部内容。 在下面的评论部分中将您的问题/疑问交给我。
......
......@@ -2,13 +2,13 @@
> 原文: [https://howtodoinjava.com/algorithm/quicksort-java-example/](https://howtodoinjava.com/algorithm/quicksort-java-example/)
**快速排序算法**是最常用的排序算法之一,尤其是对大型列表/数组进行排序。 Quicksort 是**分而治之算法**,这意味着将原始数组分为两个数组,每个数组分别进行排序,然后将排序后的输出合并以生成排序后的数组。 平均而言,**具有 O(n log n)复杂度**,这使得快速排序适合于对大数据量进行排序。
**快速排序算法**是最常用的排序算法之一,尤其是对大型列表/数组进行排序。 快速排序是**分而治之算法**,这意味着将原始数组分为两个数组,每个数组分别进行排序,然后将排序后的输出合并以生成排序后的数组。 平均而言,**具有`O(n log n)`复杂度**,这使得快速排序适合于对大数据量进行排序。
用更标准的词来说,快速排序算法通过与`pivot`元素进行比较,将未排序的部分重复地分为低阶子部分和高阶子部分。 递归结束时,我们得到了排序数组。 请注意,可以将快速排序实现为“就地”排序。 这意味着排序在数组中进行,不需要创建其他数组。
用更标准的词来说,快速排序算法通过与枢轴元素进行比较,将未排序的部分重复地分为低阶子部分和高阶子部分。 递归结束时,我们得到了排序数组。 请注意,可以将快速排序实现为“就地”排序。 这意味着排序在数组中进行,不需要创建其他数组。
## 快速排序算法
Quicksort 算法的基本思想可以描述为以下步骤:
快速排序算法的基本思想可以描述为以下步骤:
如果数组仅包含一个元素或零个元素,则对数组进行排序。 如果数组包含多个元素,则:
......@@ -16,9 +16,9 @@ Quicksort 算法的基本思想可以描述为以下步骤:
2. 数据元素分为两部分:一个元素的顺序比枢轴元素低,一个元素的顺序比枢轴元素高。
3. 重复步骤 1 和 2,分别对这两部分进行排序。
## Quicksort Java 示例
## 快速排序 Java 示例
以下是示例 **quicksort Java 实现**
以下是示例**快速排序 Java 实现**
```java
public class QuickSortExample
......@@ -93,6 +93,6 @@ public class QuickSortExample
Output: [3, 6, 10, 12, 13, 24, 70, 90]
```
在 Java 中, [**`Arrays.sort()`**](http://developer.classpath.org/doc/java/util/Arrays-source.html) 方法使用快速排序算法使用双枢轴元素对基元数组进行排序。 双枢轴使该算法更快。 检查出。
在 Java 中, [**`Arrays.sort()`**](http://developer.classpath.org/doc/java/util/Arrays-source.html)方法使用快速排序算法使用双枢轴元素对基元数组进行排序。 双枢轴使该算法更快。 检查出。
学习愉快!
\ No newline at end of file
......@@ -2,13 +2,13 @@
> 原文: [https://howtodoinjava.com/algorithm/selection-sort-java-example/](https://howtodoinjava.com/algorithm/selection-sort-java-example/)
**选择排序**是一种简单且缓慢的排序算法,**反复从未排序部分中选择最低或最高元素,然后将其移至已排序部分**的末尾。 通常,从性能角度来看,它甚至比 [**插入排序**](//howtodoinjava.com/2015/10/27/insertion-sort-java-example/) 还要慢。 它不会以任何方式适应数据,因此其运行时间始终是二次的。
**选择排序**是一种简单且缓慢的排序算法,**反复从未排序部分中选择最低或最高元素,然后将其移至已排序部分**的末尾。 通常,从性能角度来看,它甚至比[**插入排序**](//howtodoinjava.com/2015/10/27/insertion-sort-java-example/)还要慢。 它不会以任何方式适应数据,因此其运行时间始终是二次的。
但是,您不应得出结论,永远不要使用选择排序。 好东西是选择排序具有**的属性,可将每次迭代**的交换次数减至最少。 在交换项目成本很高的应用中,选择排序可能是很好的选择算法。
## 选择排序算法
以下是逻辑代码结构或通常的`pseudo code of selection sort`
以下是逻辑代码结构或通常的选择排序的伪代码
```java
for i = 1:n,
......
......@@ -51,7 +51,7 @@ HashMap 不是线程安全的。 我们可以在并发应用中使用 **HashTabl
#### 1.6 [Java Collections 面试问题](//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/)
我是否应该建议您准备**收集框架**及其所有主要类别? 我想你已经足够聪明了。
我是否应该建议您准备**集合框架**及其所有主要类别? 我想你已经足够聪明了。
如果没有任何与馆藏框架有关的问题,则任何面试(初中和中级)都将是不完整的。 它真正测试您的编程技能和对核心 Java API 的了解。 问题可能像集合层次结构一样简单,而困难的问题例如队列和堆栈。 这是此类常见收藏采访问题的列表:
......@@ -68,7 +68,7 @@ HashMap 不是线程安全的。 我们可以在并发应用中使用 **HashTabl
* 什么是 **IdentityHashMap****WeakHashMap**
* 什么时候使用 HashMap 或 TreeMap?
* 如何使收藏集只读?
* 如何使收集线程安全?
* 如何使集合线程安全?
* **故障快速****故障安全**有什么区别?
* 什么是**比较器****比较器**接口?
* 什么是集合和**数组**类?
......
......@@ -93,7 +93,7 @@ Java Collection Hierarchy
如上图所示,收集框架顶部有一个接口,即**收集**。 通过设置,列表和队列接口对其进行了扩展。 然后在这 3 个分支中还有其他类别的负载,我们将在以下问题中学习。
如上图所示,集合框架顶部有一个接口,即**集合**。 通过设置,列表和队列接口对其进行了扩展。 然后在这 3 个分支中还有其他类别的负载,我们将在以下问题中学习。
记住`Collection`接口的签名。 它会在很多问题上帮助您。
......@@ -104,7 +104,7 @@ public interface Collection extends Iterable {
```
框架还包含`Map`接口,它是收集框架的一部分。 但它不会扩展 Collection 接口。 我们将在此问题库中的第四个问题中看到原因。
框架还包含`Map`接口,它是集合框架的一部分。 但它不会扩展 Collection 接口。 我们将在此问题库中的第四个问题中看到原因。
#### 3)为什么 Collection 接口没有扩展 Cloneable 和 Serializable 接口?
......@@ -112,7 +112,7 @@ public interface Collection extends Iterable {
另一个原因是并非每个人都有理由拥有 Cloneable 集合,因为如果它具有非常大的数据,那么每个**不必要的克隆操作都将消耗大量内存**。 初学者可能在不知道后果的情况下使用它。
另一个原因是 **Cloneable 和 Serializable 是非常专门的行为**,因此仅在需要时才应实现。 例如,集合中的许多具体类都实现了这些接口。 因此,如果您想要此功能。 使用这些收集类,否则使用其替代类。
另一个原因是 **Cloneable 和 Serializable 是非常专门的行为**,因此仅在需要时才应实现。 例如,集合中的许多具体类都实现了这些接口。 因此,如果您想要此功能。 使用这些集合类,否则使用其替代类。
#### 4)为什么 Map 接口没有扩展 Collection 接口?
......@@ -130,7 +130,7 @@ Java 列表是元素的**“有序”集合。 该排序是基于**零的索引*
#### 6)如何将 String 数组转换为 arraylist?
这更多是一个程序性问题,在初学者水平上可以看到。 目的是检查收集工具类中申请人的知识。 现在,让我们了解 Collection 框架中有两个工具类,它们大多数在面试中看到,即 **Collections 和 Arrays**
这更多是一个程序性问题,在初学者水平上可以看到。 目的是检查集合工具类中申请人的知识。 现在,让我们了解 Collection 框架中有两个工具类,它们大多数在面试中看到,即 **Collections 和 Arrays**
集合类提供了一些静态函数来对集合类型执行特定操作。 数组提供了要在数组类型上执行的工具功能。
......@@ -322,7 +322,7 @@ Java 中的 HashMap 和 Hashtable 之间有一些区别:
让我们记下差异:
* Vector 的所有方法都是同步的。 但是,ArrayList 的方法不同步。
* Vector 是在 JDK 的第一个版本中添加的旧类。 当在 Java 中引入收集框架时,ArrayList 是 JDK 1.2 的一部分。
* Vector 是在 JDK 的第一个版本中添加的旧类。 当在 Java 中引入集合框架时,ArrayList 是 JDK 1.2 的一部分。
* 默认情况下,Vector 在内部调整大小时会将其数组的大小加倍。 但是,重新调整大小时,ArrayList 的大小增加一半。
#### 22)迭代器和枚举之间的区别?
......@@ -367,7 +367,7 @@ SortedSet 是 TreeSet 实现的接口。 就是这样!
这些方法采用 collection 参数,并返回一个具有与原始 collection 中相同的元素的新的只读 collection。
#### 28)如何使收集线程安全?
#### 28)如何使集合线程安全?
使用以下方法:
......@@ -422,7 +422,7 @@ CopyOnWriteArrayList 的迭代器是故障安全迭代器的示例,而且 Conc
例如,如果您使用“ Collections.unmodifiableList(list)”创建一个只读列表列表,然后调用 add()或 remove()方法,那将会发生什么。 它应该明确抛出 UnsupportedOperationException。
#### 35)哪些收集类别可随机访问其元素?
#### 35)哪些集合类可随机访问其元素?
ArrayList,HashMap,TreeMap,Hashtable 类提供对其元素的随机访问。
......@@ -456,13 +456,13 @@ BlockingQueue 方法有四种形式:一种抛出异常,第二种返回一个
#### 39)什么是 Collections 和 Arrays 类?
**Collections 和 Arrays 类是支持收集框架核心类的特殊工具类。** 它们提供工具功能以获取只读/同步集合,以各种方式对集合进行排序等。
**Collections 和 Arrays 类是支持集合框架核心类的特殊工具类。** 它们提供工具功能以获取只读/同步集合,以各种方式对集合进行排序等。
数组还帮助对象数组转换为集合对象。 数组还具有一些功能,有助于复制或处理部分数组对象。
#### 40)推荐资源
好吧,这不是面试的问题.. :-)。 这只是为了好玩。 但是您应该真正阅读我的博客,以获取有关收集框架知识的更多帖子。
好吧,这不是面试的问题.. :-)。 这只是为了好玩。 但是您应该真正阅读我的博客,以获取有关集合框架知识的更多帖子。
希望这些 Java 集合面试问题对您的下一次面试有所帮助。 此外,除了本文之外,我建议您阅读更多有关上述问题的信息。 更多的知识只会帮助您。
......
......@@ -76,7 +76,7 @@ ConcurrentHashMap Internal Structure
那么区别是什么呢。 好吧,由于上述原因,**没有重大差异**。 两个集合的性能也相同。
唯一将它们分开的是事实 **HashTable 是提升为收集框架的旧版**类。 它具有自己的额外功能,例如枚举器。
唯一将它们分开的是事实 **HashTable 是提升为集合框架的旧版**类。 它具有自己的额外功能,例如枚举器。
## 7.密钥的随机/固定 hashcode()值的影响
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册