From 296d3cf8948b9eb6b1a64773b2052659b5c12523 Mon Sep 17 00:00:00 2001 From: huihut Date: Mon, 16 Apr 2018 22:23:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=92=E5=BA=8F=E7=AE=97?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=8F=92=E5=80=BC=E3=80=81?= =?UTF-8?q?=E6=96=90=E6=B3=A2=E9=82=A3=E5=A5=91=E3=80=81=E5=93=88=E5=B8=8C?= =?UTF-8?q?=E3=80=81=E4=BA=8C=E5=8F=89=E6=A0=91=E3=80=81=E7=BA=A2=E9=BB=91?= =?UTF-8?q?=E6=A0=91=E3=80=812-3=E6=A0=91=E3=80=81B/B+=E6=A0=91=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Algorithm/BSTSearch.h | 30 ++ Algorithm/BruteForceStringMatch.h | 14 - Algorithm/{BucketSort.h => BucketSort.cpp} | 0 Algorithm/{CountSort.h => CountSort.cpp} | 0 Algorithm/FibonacciSearch.cpp | 71 +++++ Algorithm/FileSearch/README.md | 20 -- Algorithm/FileSearch/input.txt | 5 - Algorithm/FileSearch/search.cpp | 105 ------- Algorithm/FileSearch/search.exe | Bin 124928 -> 0 bytes Algorithm/FileSort/README.md | 24 -- Algorithm/FileSort/input.txt | 1 - Algorithm/FileSort/output.txt | 1 - Algorithm/FileSort/sort.cpp | 194 ------------ Algorithm/FileSort/sort.exe | Bin 119296 -> 0 bytes Algorithm/{HeapSort.h => HeapSort.cpp} | 0 Algorithm/InsertionSearch.h | 11 + DataStructure/RedBlackTree.cpp | 330 +++++++++++++++++++++ README.md | 34 +-- 18 files changed, 454 insertions(+), 386 deletions(-) create mode 100644 Algorithm/BSTSearch.h delete mode 100644 Algorithm/BruteForceStringMatch.h rename Algorithm/{BucketSort.h => BucketSort.cpp} (100%) rename Algorithm/{CountSort.h => CountSort.cpp} (100%) create mode 100644 Algorithm/FibonacciSearch.cpp delete mode 100644 Algorithm/FileSearch/README.md delete mode 100644 Algorithm/FileSearch/input.txt delete mode 100644 Algorithm/FileSearch/search.cpp delete mode 100644 Algorithm/FileSearch/search.exe delete mode 100644 Algorithm/FileSort/README.md delete mode 100644 Algorithm/FileSort/input.txt delete mode 100644 Algorithm/FileSort/output.txt delete mode 100644 Algorithm/FileSort/sort.cpp delete mode 100644 Algorithm/FileSort/sort.exe rename Algorithm/{HeapSort.h => HeapSort.cpp} (100%) create mode 100644 Algorithm/InsertionSearch.h create mode 100644 DataStructure/RedBlackTree.cpp diff --git a/Algorithm/BSTSearch.h b/Algorithm/BSTSearch.h new file mode 100644 index 0000000..ac76c35 --- /dev/null +++ b/Algorithm/BSTSearch.h @@ -0,0 +1,30 @@ +/* +二叉搜索树的查找算法: + +在二叉搜索树b中查找x的过程为: + +1. 若b是空树,则搜索失败,否则: +2. 若x等于b的根节点的数据域之值,则查找成功;否则: +3. 若x小于b的根节点的数据域之值,则搜索左子树;否则: +4. 查找右子树。 + +*/ + +// 在根指针T所指二叉查找树中递归地查找其关键字等于key的数据元素,若查找成功, +// 则指针p指向該数据元素节点,并返回TRUE,否则指针指向查找路径上访问的最终 +// 一个节点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL +Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p){ + + if(!T) { //查找不成功 + p=f; + return false; + } + else if (key == T->data.key) { //查找成功 + p=T; + return true; + } + else if (key < T->data.key) //在左子树中继续查找 + return SearchBST(T->lchild, key, T, p); + else //在右子树中继续查找 + return SearchBST(T->rchild, key, T, p); +} \ No newline at end of file diff --git a/Algorithm/BruteForceStringMatch.h b/Algorithm/BruteForceStringMatch.h deleted file mode 100644 index 5354509..0000000 --- a/Algorithm/BruteForceStringMatch.h +++ /dev/null @@ -1,14 +0,0 @@ -// 蛮力字符串匹配 -int BruteForceStringMatch(vector& Total, vector& Part) -{ - int i, j; - for (i = 0; i < Total.size() - Part.size(); ++i) { - j = 0; - while (j < Part.size() && Part[j] == Total[i + j]) { - ++j; - if (j == Part.size()) - return i; - } - } - return -1; -} \ No newline at end of file diff --git a/Algorithm/BucketSort.h b/Algorithm/BucketSort.cpp similarity index 100% rename from Algorithm/BucketSort.h rename to Algorithm/BucketSort.cpp diff --git a/Algorithm/CountSort.h b/Algorithm/CountSort.cpp similarity index 100% rename from Algorithm/CountSort.h rename to Algorithm/CountSort.cpp diff --git a/Algorithm/FibonacciSearch.cpp b/Algorithm/FibonacciSearch.cpp new file mode 100644 index 0000000..98f3c31 --- /dev/null +++ b/Algorithm/FibonacciSearch.cpp @@ -0,0 +1,71 @@ +// 斐波那契查找 + +#include "stdafx.h" +#include +#include +using namespace std; + +const int max_size=20;//斐波那契数组的长度 + +/*构造一个斐波那契数组*/ +void Fibonacci(int * F) +{ + F[0]=0; + F[1]=1; + for(int i=2;iF[k]-1)//计算n位于斐波那契数列的位置 + ++k; + + int * temp;//将数组a扩展到F[k]-1的长度 + temp=new int [F[k]-1]; + memcpy(temp,a,n*sizeof(int)); + + for(int i=n;itemp[mid]) + { + low=mid+1; + k-=2; + } + else + { + if(mid=n则说明是扩展的数值,返回n-1 + } + } + delete [] temp; + return -1; +} + +int main() +{ + int a[] = {0,16,24,35,47,59,62,73,88,99}; + int key=100; + int index=FibonacciSearch(a,sizeof(a)/sizeof(int),key); + cout<` 中存储 - -通过用户输入关键字(`keyword`)进行查找 - -输出查找到的关键字出现的位置(第几个词) \ No newline at end of file diff --git a/Algorithm/FileSearch/input.txt b/Algorithm/FileSearch/input.txt deleted file mode 100644 index 2c103a3..0000000 --- a/Algorithm/FileSearch/input.txt +++ /dev/null @@ -1,5 +0,0 @@ -Just arrived in Kathmandu tonight and needed to eat, -we checked Trip advisor and came here because it was close to hotel. -Certainly deserves its number 1 rating. -Food is so tasty and the atmosphere is very relaxed. -I would definitely recommend. \ No newline at end of file diff --git a/Algorithm/FileSearch/search.cpp b/Algorithm/FileSearch/search.cpp deleted file mode 100644 index 19e2e74..0000000 --- a/Algorithm/FileSearch/search.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include -#include - -using namespace std; - -#define OK 0 -#define ERROR -1 -#define INPUTNAME "input.txt" - -// 查找 -int search(vector& v_data, string keyword) { - int i = 0; - - // 遍历每个元素直到找到关键字 - for (; i < v_data.size(); i++) { - - // 比较关键字与每个词是否相等 - if (0 == v_data[i].compare(keyword)){ - - // 相等则返回关键字的位序 - return i; - } - } - return ERROR; -} - - -// 文件读取 -int FileRead(vector& v_data) { - - ifstream f_in(INPUTNAME); - - //判断读取失败 - if (!f_in) { - cout << "文件读取失败!" << endl; - system("pause"); - return ERROR; - } - - string word; - - // 文件逐个读取 - while (!f_in.eof()) { - f_in >> word; - v_data.push_back(word); - } - - // 关闭文件 - f_in.close(); - - return OK; -} - -// 界面 -void Interface(string& keyword) { - cout << "-------------------- 文件查找 --------------------" << endl; - cout << "【说明】:本程序实现对文件内容的查找" << endl; - cout << "即从input.txt读入,查找关键字的首次出现位置" << endl; - cout << "--------------------------------------------------" << endl; - cout << "请输入关键字:" << endl; - cout << "--------------------------------------------------" << endl; - cin >> keyword; - cout << "--------------------------------------------------" << endl; -} - -int main() { - - vector v_data; - - // 文件读取 - if (ERROR == FileRead(v_data)) - return ERROR; - - int index = -1; - string keyword; - - // 界面 - Interface(keyword); - - // 合法性检测 - if (keyword.empty()) { - cout << "请输入合法的关键字!" << endl; - system("pause"); - return ERROR; - } - - // 查找 - index = search(v_data, keyword); - - //未找到输出 - if (ERROR == index) { - cout << "未找到此关键字!" << endl; - system("pause"); - return ERROR; - } - - //输出找到的关键字索引 - cout << "此关键字位于第 " << index + 1 << " 个词的位置!" << endl; - - system("pause"); - - return OK; -} diff --git a/Algorithm/FileSearch/search.exe b/Algorithm/FileSearch/search.exe deleted file mode 100644 index 7e4ee2da9d605b84e1207f4fbc602e49680a2e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124928 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 中存储 - -通过用户输入的排序算法(`i_algorithm`)和排序方式(`i_mode`) - -选择对于的选择排序(`SelectSort()`)或者冒泡排序(`BubbleSort()`)进行排序 - -排序后输出 `vector` 到 `output.txt` \ No newline at end of file diff --git a/Algorithm/FileSort/input.txt b/Algorithm/FileSort/input.txt deleted file mode 100644 index 343ab36..0000000 --- a/Algorithm/FileSort/input.txt +++ /dev/null @@ -1 +0,0 @@ -33 22 66 99 11 68 39 89 107 749 20 6 \ No newline at end of file diff --git a/Algorithm/FileSort/output.txt b/Algorithm/FileSort/output.txt deleted file mode 100644 index a136e47..0000000 --- a/Algorithm/FileSort/output.txt +++ /dev/null @@ -1 +0,0 @@ -6 11 20 22 33 39 66 68 89 99 107 749 \ No newline at end of file diff --git a/Algorithm/FileSort/sort.cpp b/Algorithm/FileSort/sort.cpp deleted file mode 100644 index 94beeca..0000000 --- a/Algorithm/FileSort/sort.cpp +++ /dev/null @@ -1,194 +0,0 @@ -#include -#include -#include - -using namespace std; - -#define OK 0 -#define ERROR -1 -#define INPUTNAME "input.txt" -#define OUTPUTNAME "output.txt" - -// 选择排序 -int SelectSort(vector& v_data, int b_mode) { - - size_t i_num = v_data.size(), temp = 0; - - // 从小到大排 - if (0 == b_mode) { - size_t min; - for (size_t i = 0; i < i_num - 1; i++) { - min = i; - for (size_t j = i + 1; j < i_num; j++) - if (v_data[min] > v_data[j]) - min = j; - if (min != i) { - temp = v_data[min]; - v_data[min] = v_data[i]; - v_data[i] = temp; - } - } - } - - // 从大到小排 - else { - size_t max; - for (size_t i = 0; i < i_num - 1; i++) { - max = i; - for (size_t j = i + 1; j < i_num; j++) - if (v_data[max] < v_data[j]) - max = j; - if (max != i) { - temp = v_data[max]; - v_data[max] = v_data[i]; - v_data[i] = temp; - } - } - } - - return OK; -} - -// 冒泡排序 -int BubbleSort(vector& v_data, int b_mode) { - - size_t num = v_data.size(), temp = 0; - - // 从小到大排 - if (0 == b_mode) { - for (size_t i = 0; i < num - 1; i++) { - for (size_t j = 0; j < num - i - 1; j++) { - if (v_data[j] > v_data[j + 1]) { - temp = v_data[j]; - v_data[j] = v_data[j + 1]; - v_data[j + 1] = temp; - } - } - } - } - - // 从大到小排 - else { - for (size_t i = 0; i < num - 1; i++) { - for (size_t j = 0; j < num - i - 1; j++) { - if (v_data[j] < v_data[j + 1]) { - temp = v_data[j]; - v_data[j] = v_data[j + 1]; - v_data[j + 1] = temp; - } - } - } - } - - return OK; -} - -// 文件读取 -int FileRead(vector& v_data) { - - ifstream f_in(INPUTNAME); - - //判断读取失败 - if (!f_in) { - cout << "文件读取失败!" << endl; - system("pause"); - return ERROR; - } - - int i_temp; - - // 文件逐个读取 - while (!f_in.eof()) { - f_in >> i_temp; - v_data.push_back(i_temp); - } - - // 关闭文件 - f_in.close(); - - return OK; -} - -// 文件写入 -int FileWrite(vector& v_data) { - - ofstream f_out(OUTPUTNAME); - - // 判断读取失败 - if (!f_out) { - cout << "文件写入失败!" << endl; - return ERROR; - } - - // 文件逐个写入 - for (int i = 0; i < v_data.size(); i++) - f_out << v_data[i] << " "; - - f_out.close(); - return OK; -} - -// 界面 -void Interface(int& i_algorithm, int& i_mode) { - cout << "-------------------- 文件排序 --------------------" << endl; - cout << "【说明】:本程序实现对文件内容的排序" << endl; - cout << "即从input.txt读入,排序后写入到output.txt" << endl; - cout << "--------------------------------------------------" << endl; - cout << "请选择排序算法:" << endl; - cout << "【0】选择排序" << endl; - cout << "【1】冒泡排序" << endl; - cout << "--------------------------------------------------" << endl; - cin >> i_algorithm; - cout << "--------------------------------------------------" << endl; - cout << "请选择排序方式:" << endl; - cout << "【0】从小到大" << endl; - cout << "【1】从大到小" << endl; - cout << "--------------------------------------------------" << endl; - cin >> i_mode; - cout << "--------------------------------------------------" << endl; -} - -int main() { - - vector v_data; - - // 文件读取 - if (ERROR == FileRead(v_data)) - return ERROR; - - int i_algorithm, i_mode; - - // 界面 - Interface(i_algorithm, i_mode); - - // 排序算法选择检测 - if (0 != i_algorithm && 1 != i_algorithm) { - cout << "排序算法选择错误!" << endl; - system("pause"); - return ERROR; - } - - // 排序方式选择检测 - if (0 != i_mode && 1 != i_mode) { - cout << "排序方式选择错误!" << endl; - system("pause"); - return ERROR; - } - - // 排序 - if (i_algorithm) - BubbleSort(v_data, i_mode); - else - SelectSort(v_data, i_mode); - - // 文件写入 - if (ERROR == FileWrite(v_data)) - return ERROR; - - cout << "排序完成,数据已写入:" << OUTPUTNAME << endl; - cout << "--------------------------------------------------" << endl; - - system("pause"); - - return OK; -} diff --git a/Algorithm/FileSort/sort.exe b/Algorithm/FileSort/sort.exe deleted file mode 100644 index 225560d4256f710ce978f4578dfb2f300c8eef76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119296 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 + return InsertionSearch(a, value, low, mid-1); + if(a[mid] + +using namespace std; + +class bst { +private: + + struct Node { + int value; + bool color; + Node *leftTree, *rightTree, *parent; + + Node() : value(0), color(RED), leftTree(NULL), rightTree(NULL), parent(NULL) { } + + Node* grandparent() { + if(parent == NULL){ + return NULL; + } + return parent->parent; + } + + Node* uncle() { + if(grandparent() == NULL) { + return NULL; + } + if(parent == grandparent()->rightTree) + return grandparent()->leftTree; + else + return grandparent()->rightTree; + } + + Node* sibling() { + if(parent->leftTree == this) + return parent->rightTree; + else + return parent->leftTree; + } + }; + + void rotate_right(Node *p){ + Node *gp = p->grandparent(); + Node *fa = p->parent; + Node *y = p->rightTree; + + fa->leftTree = y; + + if(y != NIL) + y->parent = fa; + p->rightTree = fa; + fa->parent = p; + + if(root == fa) + root = p; + p->parent = gp; + + if(gp != NULL){ + if(gp->leftTree == fa) + gp->leftTree = p; + else + gp->rightTree = p; + } + + } + + void rotate_left(Node *p){ + if(p->parent == NULL){ + root = p; + return; + } + Node *gp = p->grandparent(); + Node *fa = p->parent; + Node *y = p->leftTree; + + fa->rightTree = y; + + if(y != NIL) + y->parent = fa; + p->leftTree = fa; + fa->parent = p; + + if(root == fa) + root = p; + p->parent = gp; + + if(gp != NULL){ + if(gp->leftTree == fa) + gp->leftTree = p; + else + gp->rightTree = p; + } + } + + void inorder(Node *p){ + if(p == NIL) + return; + + if(p->leftTree) + inorder(p->leftTree); + + cout << p->value << " "; + + if(p->rightTree) + inorder(p->rightTree); + } + + string outputColor (bool color) { + return color ? "BLACK" : "RED"; + } + + Node* getSmallestChild(Node *p){ + if(p->leftTree == NIL) + return p; + return getSmallestChild(p->leftTree); + } + + bool delete_child(Node *p, int data){ + if(p->value > data){ + if(p->leftTree == NIL){ + return false; + } + return delete_child(p->leftTree, data); + } else if(p->value < data){ + if(p->rightTree == NIL){ + return false; + } + return delete_child(p->rightTree, data); + } else if(p->value == data){ + if(p->rightTree == NIL){ + delete_one_child (p); + return true; + } + Node *smallest = getSmallestChild(p->rightTree); + swap(p->value, smallest->value); + delete_one_child (smallest); + + return true; + }else{ + return false; + } + } + + void delete_one_child(Node *p){ + Node *child = p->leftTree == NIL ? p->rightTree : p->leftTree; + if(p->parent == NULL && p->leftTree == NIL && p->rightTree == NIL){ + p = NULL; + root = p; + return; + } + + if(p->parent == NULL){ + delete p; + child->parent = NULL; + root = child; + root->color = BLACK; + return; + } + + if(p->parent->leftTree == p){ + p->parent->leftTree = child; + } else { + p->parent->rightTree = child; + } + child->parent = p->parent; + + if(p->color == BLACK){ + if(child->color == RED){ + child->color = BLACK; + } else + delete_case (child); + } + + delete p; + } + + void delete_case(Node *p){ + if(p->parent == NULL){ + p->color = BLACK; + return; + } + if(p->sibling()->color == RED) { + p->parent->color = RED; + p->sibling()->color = BLACK; + if(p == p->parent->leftTree) + rotate_left(p->sibling()); + else + rotate_right(p->sibling()); + } + if(p->parent->color == BLACK && p->sibling()->color == BLACK + && p->sibling()->leftTree->color == BLACK && p->sibling()->rightTree->color == BLACK) { + p->sibling()->color = RED; + delete_case(p->parent); + } else if(p->parent->color == RED && p->sibling()->color == BLACK + && p->sibling()->leftTree->color == BLACK && p->sibling()->rightTree->color == BLACK) { + p->sibling()->color = RED; + p->parent->color = BLACK; + } else { + if(p->sibling()->color == BLACK) { + if(p == p->parent->leftTree && p->sibling()->leftTree->color == RED + && p->sibling()->rightTree->color == BLACK) { + p->sibling()->color = RED; + p->sibling()->leftTree->color = BLACK; + rotate_right(p->sibling()->leftTree); + } else if(p == p->parent->rightTree && p->sibling()->leftTree->color == BLACK + && p->sibling()->rightTree->color == RED) { + p->sibling()->color = RED; + p->sibling()->rightTree->color = BLACK; + rotate_left(p->sibling()->rightTree); + } + } + p->sibling()->color = p->parent->color; + p->parent->color = BLACK; + if(p == p->parent->leftTree){ + p->sibling()->rightTree->color = BLACK; + rotate_left(p->sibling()); + } else { + p->sibling()->leftTree->color = BLACK; + rotate_right(p->sibling()); + } + } + } + + void insert(Node *p, int data){ + if(p->value >= data){ + if(p->leftTree != NIL) + insert(p->leftTree, data); + else { + Node *tmp = new Node(); + tmp->value = data; + tmp->leftTree = tmp->rightTree = NIL; + tmp->parent = p; + p->leftTree = tmp; + insert_case (tmp); + } + } else { + if(p->rightTree != NIL) + insert(p->rightTree, data); + else { + Node *tmp = new Node(); + tmp->value = data; + tmp->leftTree = tmp->rightTree = NIL; + tmp->parent = p; + p->rightTree = tmp; + insert_case (tmp); + } + } + } + + void insert_case(Node *p){ + if(p->parent == NULL){ + root = p; + p->color = BLACK; + return; + } + if(p->parent->color == RED){ + if(p->uncle()->color == RED) { + p->parent->color = p->uncle()->color = BLACK; + p->grandparent()->color = RED; + insert_case(p->grandparent()); + } else { + if(p->parent->rightTree == p && p->grandparent()->leftTree == p->parent) { + rotate_left (p); + rotate_right (p); + p->color = BLACK; + p->leftTree->color = p->rightTree->color = RED; + } else if(p->parent->leftTree == p && p->grandparent()->rightTree == p->parent) { + rotate_right (p); + rotate_left (p); + p->color = BLACK; + p->leftTree->color = p->rightTree->color = RED; + } else if(p->parent->leftTree == p && p->grandparent()->leftTree == p->parent) { + p->parent->color = BLACK; + p->grandparent()->color = RED; + rotate_right(p->parent); + } else if(p->parent->rightTree == p && p->grandparent()->rightTree == p->parent) { + p->parent->color = BLACK; + p->grandparent()->color = RED; + rotate_left(p->parent); + } + } + } + } + + void DeleteTree(Node *p){ + if(!p || p == NIL){ + return; + } + DeleteTree(p->leftTree); + DeleteTree(p->rightTree); + delete p; + } +public: + + bst() { + NIL = new Node(); + NIL->color = BLACK; + root = NULL; + } + + ~bst() { + if (root) + DeleteTree (root); + delete NIL; + } + + void inorder() { + if(root == NULL) + return; + inorder (root); + cout << endl; + } + + void insert (int x) { + if(root == NULL){ + root = new Node(); + root->color = BLACK; + root->leftTree = root->rightTree = NIL; + root->value = x; + } else { + insert(root, x); + } + } + + bool delete_value (int data) { + return delete_child(root, data); + } +private: + Node *root, *NIL; +}; \ No newline at end of file diff --git a/README.md b/README.md index f20f117..2e77a7f 100644 --- a/README.md +++ b/README.md @@ -1251,13 +1251,12 @@ typedef struct BiTNode [选择排序](Algorithm/SelectionSort.h) | O(n2)|O(n2)|O(1)|数组不稳定、链表稳定 [插入排序](Algorithm/InsertSort.h) | O(n2)|O(n2)|O(1)|稳定 [快速排序](Algorithm/QuickSort.h) | O(n*log2n) | O(n2) | O(log2n) | 不稳定 -[堆排序](Algorithm/HeapSort.h) | O(n*log2n)|O(n2)|O(1)|不稳定 +[堆排序](Algorithm/HeapSort.cpp) | O(n*log2n)|O(n2)|O(1)|不稳定 [归并排序](Algorithm/MergeSort.h) | O(n*log2n) | O(n*log2n)|O(1)|稳定 [希尔排序](Algorithm/ShellSort.h) | O(n*log2n)|O(n2)|O(1)|不稳定 -[计数排序](Algorithm/CountSort.h) | O(n+m)|O(n+m)|O(n+m)|稳定 -[桶排序](Algorithm/BucketSort.h) | O(n)|O(n)|O(m)|稳定 +[计数排序](Algorithm/CountSort.cpp) | O(n+m)|O(n+m)|O(n+m)|稳定 +[桶排序](Algorithm/BucketSort.cpp) | O(n)|O(n)|O(m)|稳定 [基数排序](Algorithm/RadixSort.h) | O(k*n)|O(n2)| |稳定 -[文件排序](Algorithm/FileSort) | > * 均按从小到大排列 > * k:代表数值中的"数位"个数 @@ -1271,8 +1270,13 @@ typedef struct BiTNode ---|---|---|--- [顺序查找](Algorithm/SequentialSearch.h) | O(n) | O(1) | 无序或有序 [二分查找(折半查找)](Algorithm/BinarySearch.h) | O(log2n)| O(1) | 有序 -[蛮力字符串匹配](Algorithm/BruteForceStringMatch.h) | O(n*m) | -[文件查找](Algorithm/FileSearch) | +[插值查找](Algorithm/InsertionSearch.h) | O(log2(log2n)) | O(1) | 有序 +[斐波那契查找](Algorithm/FibonacciSearch.cpp) | O(log2n) | O(1) | 有序 +[哈希查找](DataStructure/HashTable.cpp) | O(1) | O(n) | 无序或有序 +[二叉查找树(二叉搜索树查找)](Algorithm/BSTSearch.h) |O(log2n) | | +[红黑树](DataStructure/RedBlackTree.cpp) |O(log2n) | | +2-3树 | O(log2n - log3n) | | +B树/B+树 |O(log2n) | | ## Problems @@ -1286,22 +1290,8 @@ typedef struct BiTNode ### Leetcode Problems -#### Array - -* [1. Two Sum](Problems/LeetcodeProblems/1-two-sum.h) -* [4. Median of Two Sorted Arrays](Problems/LeetcodeProblems/4-median-of-two-sorted-arrays.h) -* [11. Container With Most Water](Problems/LeetcodeProblems/11-container-with-most-water.h) -* [26. Remove Duplicates from Sorted Array](Problems/LeetcodeProblems/26-remove-duplicates-from-sorted-array.h) -* [53. Maximum Subarray](Problems/LeetcodeProblems/53-maximum-subarray.h) -* [66. Plus One](Problems/LeetcodeProblems/66-plus-one.h) -* [88. Merge Sorted Array](Problems/LeetcodeProblems/88-merge-sorted-array.h) -* [118. Pascal's Triangle](Problems/LeetcodeProblems/118-pascals-triangle.h) -* [119. Pascal's Triangle II](Problems/LeetcodeProblems/119-pascals-triangle-ii.h) -* [121. Best Time to Buy and Sell Stock](Problems/LeetcodeProblems/121-best-time-to-buy-and-sell-stock.h) -* [122. Best Time to Buy and Sell Stock II](Problems/LeetcodeProblems/122-best-time-to-buy-and-sell-stock-ii.h) -* [169. Majority Element](Problems/LeetcodeProblems/169-majority-element.h) -* [283. Move Zeroes](Problems/LeetcodeProblems/283-move-zeroes.h) - +* [Github . haoel/leetcode](https://github.com/haoel/leetcode) +* [Github . pezy/LeetCode](https://github.com/pezy/LeetCode) ## 操作系统