Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
xx19941215 committed Sep 2, 2018
1 parent 8fa3a46 commit cf4ae35
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 101 deletions.
127 changes: 71 additions & 56 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,52 @@
### 数据结构和算法

#### 基础算法
1. [冒泡排序](https://github.com/xx19941215/webBlog/blob/master/algorithm/sort/bubbleSort/bubbleSort.php)
2. [插入排序](https://github.com/xx19941215/webBlog/blob/master/algorithm/sort/insertSort/insertSort.php)
3. [希尔排序](https://github.com/xx19941215/webBlog/blob/master/algorithm/sort/shellSort/shellSort.php)
4. [快速排序](https://github.com/xx19941215/webBlog/blob/master/algorithm/sort/quickSort/quickSort.php)
5. [选择排序](https://github.com/xx19941215/webBlog/blob/master/algorithm/sort/selectSort/selectSort.php)
6. [堆排序](algorithm/sort/heapSort/heapSort.php)

7. [桶排序](algorithm/sort/bucketSort/bucketSort.php)

8. [基数排序](algorithm/sort/radixSort/radixSort.php)




#### 基础数据结构

1. [链表](https://github.com/xx19941215/webBlog/blob/master/dataStructure/LinkedList/LinkedList.php)
- [双链表](https://github.com/xx19941215/webBlog/blob/master/dataStructure/DoubleLinkedList/DoubleLinkedList.php)
- [环形链表](https://github.com/xx19941215/webBlog/blob/master/dataStructure/CircularLinkedList/CircularLinkedList.php)
2. [](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Stack/StackInterface.php)
- [链表实现](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Stack/LinkedListStack.php)
- [数组实现](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Stack/ArrStack.php)
3. [队列](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Queue/QueueInterface.php)
- [链表实现](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Queue/LinkedListQueue.php)
- [数组实现](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Queue/ArrQueue.php)
- [优先队列](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Queue/LinkedListPriorityQueue.php)
- [环形队列](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Queue/CircularQueue.php)
- [双端队列](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Queue/LinkedListDeQueue.php)
4. [](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Tree/Tree.php)
- [二叉树](https://github.com/xx19941215/webBlog/blob/master/dataStructure/Tree/BinaryTree.php)
#### 算法
- 排序
- 简单排序
1. [冒泡排序](algorithm/sort/bubbleSort/bubbleSort.php)
2. [插入排序](algorithm/sort/insertSort/insertSort.php)
- [希尔排序(插入排序的改进)](algorithm/sort/shellSort/shellSort.php)
- [选择排序](algorithm/sort/selectionSort/selectionSort.php)
- [堆排序(选择排序的改进)](algorithm/sort/heapSort/heapSort.php)
- [归并排序](algorithm/sort/mergeSort/mergeSort.php)
- [桶排序](algorithm/sort/bucketSort/bucketSort.php)
- [基数排序](algorithm/sort/radixSort/radixSort.php)
- [快速排序](algorithm/sort/quickSort/quickSort.php)

- 查找
- Todo

|算法|最快时间复杂度|平均时间复杂度|最坏时间复杂度|空间复杂度|是否稳定
|--|--|--|--|--|--|
|冒泡排序|Ω(n)|Θ(n2)|O(n2)|O(1)|稳定
|插入排序|Ω(n)|Θ(n2)|O(n2)|O(1)|稳定
|希尔排序|Ω(nlogn)|Θ(n(log(n))2)|O(n(log(n))2)|O(1)|不稳定
|选择排序|Ω(n2)|Θ(n2)|O(n2)|O(1)|不稳定
|堆排序|Ω(nlogn)|Θ(nlogn)|O(nlogn)|O(1)|不稳定
|归并排序|Ω(nlogn)|Θ(nlogn)|O(nlogn)|O(n)|稳定
|快速排序|Ω(nlogn)|Θ(nlogn)|O(nlogn)|O(n)|不稳定
|基数排序|Ω(n+b)|Θ(n+b)|O(n+b)|O(n+k)|稳定

> O表示上界(小于等于) Ω表示下界(大于等于) Θ表示即是上界也是下界(等于)

#### 数据结构

1. [链表](dataStructure/LinkedList/LinkedList.php)
- [双链表](dataStructure/DoubleLinkedList/DoubleLinkedList.php)
- [环形链表](dataStructure/CircularLinkedList/CircularLinkedList.php)
2. [](dataStructure/Stack/StackInterface.php)
- [链表实现](dataStructure/Stack/LinkedListStack.php)
- [数组实现](dataStructure/Stack/ArrStack.php)
3. [队列](dataStructure/Queue/QueueInterface.php)
- [链表实现](dataStructure/Queue/LinkedListQueue.php)
- [数组实现](dataStructure/Queue/ArrQueue.php)
- [优先队列](dataStructure/Queue/LinkedListPriorityQueue.php)
- [环形队列](dataStructure/Queue/CircularQueue.php)
- [双端队列](dataStructure/Queue/LinkedListDeQueue.php)
4. [](dataStructure/Tree/Tree.php)
- [二叉树](dataStructure/Tree/BinaryTree.php)
- [二叉搜索树](dataStructure/Tree/BST.php)

5. [最大堆](dataStructure/Heap/MaxHeap.php)
Expand All @@ -56,35 +71,35 @@
> 先用PHP解答一遍,稍后Javascript版本的奉上
- 链表
- [从头到尾打印链表](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/1.php)
- [链表中倒数第k个节点](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/2.php)
- [反转链表](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/3.php)
- [合并两个排序的链表](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/4.php)
- [复杂链表的复制](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/5.php)
- [删除链表中重复的节点](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/6.php)
- [两个链表的第一个公共节点](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/7.php)
- [链表中环的入口节点](https://github.com/xx19941215/webBlog/blob/master/offer/LinkedList/8.php)
- [从头到尾打印链表](offer/LinkedList/1.php)
- [链表中倒数第k个节点](offer/LinkedList/2.php)
- [反转链表](offer/LinkedList/3.php)
- [合并两个排序的链表](offer/LinkedList/4.php)
- [复杂链表的复制](offer/LinkedList/5.php)
- [删除链表中重复的节点](offer/LinkedList/6.php)
- [两个链表的第一个公共节点](offer/LinkedList/7.php)
- [链表中环的入口节点](offer/LinkedList/8.php)

- 栈和队列
- [用两个栈来实现一个队列](https://github.com/xx19941215/webBlog/blob/master/offer/Stack&Queue/2.php)
- [栈的压入、弹出序列](https://github.com/xx19941215/webBlog/blob/master/offer/Stack&Queue/1.php)
- [用两个栈来实现一个队列](offer/Stack&Queue/2.php)
- [栈的压入、弹出序列](offer/Stack&Queue/1.php)

-
- [重建二叉树](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/1.php)
- [树的子结构](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/2.php)
- [树的镜像](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/3.php)
- [从上往下打印二叉树](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/4.php)
- [二叉搜索树的后序序列](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/5.php)
- [二叉树中和为某一值的路径](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/6.php)
- [二叉搜索树与双向链表](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/7.php)
- [二叉树的深度](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/8.php)
- [平衡二叉树](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/9.php)
- [二叉树的下一个结点](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/10.php)
- [对称的二叉树](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/11.php)
- [按之字形顺序打印二叉树](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/12.php)
- [把二叉树打印成多行](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/13.php)
- [序列化二叉树](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/14.php)
- [二叉搜索树的第k个结点](https://github.com/xx19941215/webBlog/blob/master/offer/Tree/15.php)
- [重建二叉树](offer/Tree/1.php)
- [树的子结构](offer/Tree/2.php)
- [树的镜像](offer/Tree/3.php)
- [从上往下打印二叉树](offer/Tree/4.php)
- [二叉搜索树的后序序列](offer/Tree/5.php)
- [二叉树中和为某一值的路径](offer/Tree/6.php)
- [二叉搜索树与双向链表](offer/Tree/7.php)
- [二叉树的深度](offer/Tree/8.php)
- [平衡二叉树](offer/Tree/9.php)
- [二叉树的下一个结点](offer/Tree/10.php)
- [对称的二叉树](offer/Tree/11.php)
- [按之字形顺序打印二叉树](offer/Tree/12.php)
- [把二叉树打印成多行](offer/Tree/13.php)
- [序列化二叉树](offer/Tree/14.php)
- [二叉搜索树的第k个结点](offer/Tree/15.php)


### PHP
Expand Down
2 changes: 1 addition & 1 deletion algorithm/sort/bubbleSort/bubbleSort.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
/**
* 冒泡排序 PHP实现
* 原理:两两相邻比较,如果反序就交换,否则不交换
* 时间复杂度:最坏 O(n2) 平均 O(n2)
* 时间复杂度:最好 O(n) 最坏 O(n2) 平均 O(n2)
* 空间复杂度:O(1)
* 什么时候使用:当所有的数据位于单向链表中
*/
Expand Down
8 changes: 7 additions & 1 deletion algorithm/sort/heapSort/heapSort.php
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
<?php
/**
* 堆排序是堆选择排序的改进
* 堆排序是对选择排序的改进
* 定理:堆排序处理N个不同元素的随机排列的平均比较次数
* O(NlogN) - O(NloglogN)
* 虽然堆排序给出最佳平均时间复杂度但实际效果不如用
* Sedgewick增量序列的希尔排序
*/
require_once __DIR__ . '/../uniqueRandom.php';

function heapSort(&$arr)
{
$length = count($arr);
//使用具有线性复杂度的算法把数组调整成最大堆
buildHeap($arr);
$heapSize = $length - 1;
for ($i = $heapSize; $i >= 0; $i--) {
list($arr[0], $arr[$heapSize]) = [$arr[$heapSize], $arr[0]];
$heapSize--;
//再把剩下的元素调整成最大堆
heapify(0, $heapSize, $arr);
}
}
Expand Down
7 changes: 4 additions & 3 deletions algorithm/sort/insertSort/insertSort.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
/**
* 直接插入排序(类比抓牌)
* 原理:每次从无序列表中取出第一个元素,把他插入到有序表中的合适位置,使有序表仍然有序
* 时间复杂度:最坏O(n2) 平均O(n2)
* 时间复杂度:最好O(n) 最坏O(n2) 平均O(n2)
* 空间复杂度 O(1)
* 如果序列基本有序,使用插入排序简单且高效
* 任何仅以交换相邻元素来排序的算法,平均复杂度为O(n2)
* T(N, I)=O(N+I)(N是元素个数,I是逆序对个数)换言之,如果序列基本有序,使用插入排序简单且高效
* 定理:任何N个不同元素组成的序列平均具有N(N-1)/4个逆序对
* 任何仅以交换相邻元素来排序的算法其平均时间复杂度位为Ω(n2)
* 意味着要提高算法效率我们必须每次消去不止一个逆序对或者每次交换相隔较远的两个元素
*/
require_once __DIR__ . '/../uniqueRandom.php';
Expand Down
5 changes: 4 additions & 1 deletion algorithm/sort/mergeSort/mergeSort.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

/**
* 归并排序
* 时间复杂度 O(n log n)
* 核心:两个有序子序列的归并(function merge)
* 时间复杂度任何情况下都是 O(nlogn)
* 空间复杂度 O(n)
* 发明人: 约翰·冯·诺伊曼
* 速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列
* 一般不用于内(内存)排序,一般用于外排序
*/

function mergeSort($arr)
Expand All @@ -29,6 +31,7 @@ function merge(array $left, array $right)
$leftIndex = $rightIndex = 0;
$leftLength = count($left);
$rightLength = count($right);
//临时空间
$combine = [];

//比较两个指针所在的元素
Expand Down
38 changes: 0 additions & 38 deletions algorithm/sort/selectSort/selectSort.php

This file was deleted.

47 changes: 47 additions & 0 deletions algorithm/sort/selectionSort/selectionSort.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

/**
* 选择排序
* 工作原理是每次从待排序的元素中的第一个元素设置为最小值,
* 遍历每一个没有排序过的元素,如果元素小于现在的最小值,
* 就将这个元素设置成为最小值,遍历结束就将最小值和第一个没有排过序交换位置,
* 这样的遍历需要进行元素个数-1次
* 这是一个不稳定的排序算法(排序后相对次序改变了)
* 对于选择排序如何找到最小元是关键 所以我们需要使用堆排序
*/
require_once __DIR__ . '/../uniqueRandom.php';


function selectionSort(&$arr)
{
$count = count($arr);

//重复元素个数-1次
for ($j = 0; $j <= $count - 1; $j++) {
//把第一个没有排过序的元素设置为最小值
$min = $arr[$j];
//遍历每一个没有排过序的元素
for ($i = $j + 1; $i < $count; $i++) {
//如果这个值小于最小值
if ($arr[$i] < $min) {
//把这个元素设置为最小值
$min = $arr[$i];
//把最小值的位置设置为这个元素的位置
$minPos = $i;
}
}
//内循环结束把最小值和没有排过序的元素交换
list($arr[$j], $arr[$minPos]) = [$min, $arr[$j]];
}

}

$arr = uniqueRandom(1, 100000, 5000);

$start = microtime(true);
selectionSort($arr);
$end = microtime(true);
$used = $end - $start;
echo "used $used s" . PHP_EOL;

//used 1.1448910236359 s
4 changes: 3 additions & 1 deletion algorithm/sort/shellSort/shellSort.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
/**
* 原理:把排序的数据根据增量分成几个子序列,对子序列进行插入排序,
* 直到增量为1,直接进行插入排序,增量的排序,一般是数组长度的一半,再变为原来增量的一半,直到增量为1
* 时间复杂度:最差 Ω(n2) 平均时间复杂度 O(log2n)
* 时间复杂度:最差 Θ(n2) 平均时间复杂度 O(log2n)
* 最差的情况:因为$gap的值不互质(最大公因数不是1)所以导致增量序列没有起到作用
* 可以使用例如 Hibbrd增量序列
*/

require_once __DIR__ . '/../uniqueRandom.php';
Expand Down

0 comments on commit cf4ae35

Please sign in to comment.