add sort gif
This commit is contained in:
+2
-2
@@ -35,14 +35,14 @@ for (int i=0;i<s.length();i++){
|
||||
|
||||
将大小为M的数组中的每个元素指向一条链表,链表中的每个节点都存储了散列值为该元素索引的键值对。每条链表的平均长度是N/M,N是键值对的总个数。
|
||||
|
||||
添加操作:
|
||||
添加操作:
|
||||
1. 通过hash函数得到hashCode
|
||||
2. 通过hashcode得到index
|
||||
3. 如果index处没有链表,建立好新结点,作为新链表的首结点
|
||||
4. 如果index处已经有链表,先要遍历看key是否已经存在,如果存在直接返回,如果不存在,加入链表头部
|
||||
|
||||
|
||||
删除操作:
|
||||
删除操作:
|
||||
1. 通过hash函数得到hashCode
|
||||
2. 通过hashcode得到index
|
||||
3. 遍历链表,删除结点
|
||||
|
||||
+65
-39
@@ -1,27 +1,46 @@
|
||||
|
||||
|
||||
|
||||
## 排序算法
|
||||
|
||||
**排序的稳定性** 对于相等的元素,排序之后,任然保存2个元素的位置没有变,就是稳定的排序,反之就是不稳定排序。
|
||||
**排序的稳定性** 是指对于相等的元素,排序之后,任然保存2个元素的位置没有变,就是稳定的排序,反之就是不稳定排序。
|
||||
|
||||
|
||||
**交换排序算法**
|
||||
|
||||
* 冒泡排序
|
||||
* 插入排序
|
||||
* 选择排序
|
||||
* 希尔排序
|
||||
* 快排
|
||||
* 归并排序
|
||||
* 堆排序
|
||||
|
||||
**线性排序算法**
|
||||
|
||||
* 基数排序
|
||||
* 桶排序
|
||||
* 计数排序
|
||||
|
||||
|
||||
## 交换排序算法
|
||||
|
||||
排序算法的复杂度由 `比较的次数` 和 `交换的次数` 一起决定。
|
||||
|
||||
|
||||
### 直接选择排序
|
||||
|
||||
1. 从未排序的序列中选择最小的元素,放在第一个位置
|
||||
1. 从未排序的序列中选择最小的元素,与放在第一个位置的元素交换
|
||||
2. 依次类推,直到全部排序
|
||||
|
||||
在a【i,n】中最小的元素和 a[i]交换位置。空间复杂度O(1),时间复杂度 O(n^2)
|
||||
|
||||
|
||||
|
||||
|
||||
### 冒泡排序
|
||||
|
||||
相邻的2各元素比较,大的向后移,经过一轮比较,做大的元素排在最后
|
||||
第二轮,第二大的元素排倒数第二个位置
|
||||
直到全部排好
|
||||
1. 相邻的2各元素比较,大的向后移,经过一轮比较,做大的元素排在最后
|
||||
2. 第二轮,第二大的元素排倒数第二个位置
|
||||
3. 直到全部排好
|
||||
|
||||
这样,即使是排好序的拿冒泡排序排序,比较的时间复杂度O(n^2)
|
||||
|
||||
@@ -32,12 +51,14 @@
|
||||
|
||||
1. 第一个元素算作已经排好
|
||||
2. 取下一个元素,从已经排好的序列元素中,从后向前扫描
|
||||
3. 如果排好序的元素大于 新元素,排好序的元素一道下一个位置
|
||||
3. 如果排好序的元素大于 新元素,排好序的元素移到下一个位置
|
||||
4. 重复3,直到直到最后的插入位置
|
||||
5. 重复2
|
||||
|
||||
类似插入扑克牌的效果
|
||||
|
||||
最坏的情况: 待排序的是一个逆序排放的数组,这样导致每一轮都要移动元素;此时复杂度是是0(n^2)
|
||||
最好的情况: 待排序的是一已经顺序排放的数字,此时只需要做一轮比较就够了 0(n)。因此可以看到,对大部分数据已经有序这样的数组排序,使用`插入排序`非常有优势
|
||||
最好的情况: 待排序的是一已经顺序排放的数字,此时只需要做一轮比较就够了 0(n)。因此可以看到,**对大部分数据已经有序这样的数组排序,使用`插入排序`非常有优势**
|
||||
|
||||
空间复杂度O(1)
|
||||
|
||||
@@ -53,6 +74,8 @@
|
||||
|
||||
`希尔排序`提升排序的奥秘就在于`数据元素越有序,使用插入排序效率越高`
|
||||
|
||||
|
||||
|
||||
### 快速排序
|
||||
|
||||
|
||||
@@ -113,7 +136,7 @@
|
||||
|
||||
|
||||
|
||||
平均复杂度 O(n*logn) ,
|
||||
平均复杂度 O(n*logn)
|
||||
最坏O(n^2)
|
||||
空间复杂度
|
||||
|
||||
@@ -121,6 +144,29 @@
|
||||
|
||||
|
||||
|
||||
### 归并排序merge
|
||||
|
||||
分治算法,必然用到递归
|
||||
|
||||
2个有序数组的合并操作是O(n)的复杂度
|
||||
因此我们可以将无序的数组,分成2个子数组分别排序,然后再merge,依次类推
|
||||
|
||||
归并排序的步骤
|
||||
1. 分解 , 将一个数组分成n/2个子数组,每个序列2个元素,(2路归并)
|
||||
2. 解决 , 将各个子数组都排好序,然后 merge 2个有序数组
|
||||
3. 合并
|
||||
|
||||
if (length>1)
|
||||
{
|
||||
merge_sort(a,length/2);
|
||||
merge_sort(a+length/2,length-length/2);
|
||||
merge_array(a,length/2,a+length/2,length-length/2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 堆排序
|
||||
|
||||
利用堆这种数据结构设计的一种排序算法
|
||||
@@ -177,36 +223,14 @@
|
||||
推排序还可以用来求 top-K 大(小)的问题。
|
||||
|
||||
|
||||
接下来,我们看一组排序的动画,你看看能不能猜到他们使用了什么排序算法完成。
|
||||
|
||||
### 归并排序merge
|
||||
|
||||
分治算法,必然用到递归
|
||||
|
||||
2个有序数组的合并操作是O(n)的复杂度
|
||||
因此我们可以将无序的数组,分成2个子数组分别排序,然后再merge,依次类推
|
||||
|
||||
归并排序的步骤
|
||||
1. 分解 , 将一个数组分成n/2个子数组,每个序列2个元素,(2路归并)
|
||||
2. 解决 , 将各个子数组都排好序,然后 merge 2个有序数组
|
||||
3. 合并
|
||||
|
||||
if (length>1)
|
||||
{
|
||||
merge_sort(a,length/2);
|
||||
merge_sort(a+length/2,length-length/2);
|
||||
merge_array(a,length/2,a+length/2,length-length/2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 小结
|
||||
|
||||
常见的排序算法都是比较排序,比较排序的时间复杂度通常为 O(n^2) 或 O(nlogn)
|
||||
|
||||
|
||||
|
||||
[](./quicksort.gif)
|
||||
[](./quicksort.gif)
|
||||
[](./quicksort.gif)
|
||||
[](./quicksort.gif)
|
||||
[](./quicksort.gif)
|
||||
[](./quicksort.gif)
|
||||
|
||||
|
||||
## 3种线性排序算法
|
||||
@@ -233,6 +257,8 @@
|
||||
|
||||
###小结
|
||||
|
||||
常见的排序算法都是比较排序,比较排序的时间复杂度通常为 O(n^2) 或 O(nlogn)
|
||||
但是如果带排序的数字有一些特俗性时,我们可以根据这来设计更加优化的排序算法。
|
||||
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 274 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 91 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 741 KiB |
Reference in New Issue
Block a user