[Algorithms] 分治算法(二分查找, 合并排序, 插入排序, 快速排序(coming))
2011-06-02 17:53
513 查看
分治算法::二分查找
时间复杂度: O(lgn): 每执行一次算法的while循环,数组减小为原来的一半
分治算法::插入排序
时间复杂度: 最坏情况和平均情况都是大O(n^2), 具体查阅Intro to Algorithms
分治算法::合并排序
时间复杂度: O(n * lgn), 比插入排序的O(n^2) 小很多。
template <class T> int BinarySearch(T a[], const T& x, int n) { int left = 0; int right = n - 1; while (left <= right) { int mid = (left + right) / 2; if (x == a[mid]) return mid; if (x > a[mid]) left = mid + 1; else right = mid - 1; } return (-1); }
时间复杂度: O(lgn): 每执行一次算法的while循环,数组减小为原来的一半
分治算法::插入排序
/* Refer to Intro to Algorithms * Author: Dooit.Lee@gmail.com */ #ifndef _dl_merge_h #define _dl_merge_h #include "dl_sort_template.h" template <class T> class InsertSort : public SortTemplate<T> { public: InsertSort() {} InsertSort(std::istream& is) : SortTemplate<T>(is) {} bool doSorting(); }; template <class T> bool InsertSort<T>::doSorting() { SortTemplate<T>::sortedArray.resize(SortTemplate<T>::rawArray.size()); std::copy(SortTemplate<T>::rawArray.begin(), SortTemplate<T>::rawArray.end(), SortTemplate<T>::sortedArray.begin()); if (!NDEBUG) { SortTemplate<T>::printRawArray(); } typename std::vector<T>::iterator j, i; for (j = SortTemplate<T>::sortedArray.begin() + 1; j != SortTemplate<T>::sortedArray.end(); j++) { i = j - 1; while ((i >= SortTemplate<T>::sortedArray.begin()) && (*i > *(i + 1))) { swap(*(i + 1), *i); --i; } } return true; } #endif
时间复杂度: 最坏情况和平均情况都是大O(n^2), 具体查阅Intro to Algorithms
分治算法::合并排序
/* Refer to Intro to Algorithms * Author: Dooit.Lee@gmail.com */ #ifndef _dl_merge_sort_h #define _dl_merge_sort_h #include "dl_sort_template.h" #include <cstddef> #include <algorithm> #include <vector> template <class T> class MergeSort : public SortTemplate<T> { public: MergeSort() {} MergeSort(std::istream& is) : SortTemplate<T>(is) {} bool doSorting(); private: void doMerge(std::vector<T>& A, typename std::vector<T>::iterator p, typename std::vector<T>::iterator q, typename std::vector<T>::iterator r); void doMergeSort(std::vector<T>& A, typename std::vector<T>::iterator p, typename std::vector<T>::iterator r); }; template <class T> void MergeSort<T>::doMerge(std::vector<T>& A, typename std::vector<T>::iterator p, typename std::vector<T>::iterator q, typename std::vector<T>::iterator r) { if (!(p <= q && q < r)) return; int n1 = q - p + 1; int n2 = r - q; std::vector<T> left(n1), right(n2); std::copy(p, q + 1, left.begin()); std::copy(q + 1, r + 1, right.begin()); std::size_t i = 0, j = 0; typename std::vector<T>::iterator k; // k = p to r for (k = p; k <= r; k++) { if (i < left.size() && (j == right.size() || left[i] <= right[j])) { A[k - A.begin()] = left[i]; i++; } else if (j < right.size()) { A[k - A.begin()] = right[j]; j++; } } } template <class T> void MergeSort<T>::doMergeSort(std::vector<T>& A, typename std::vector<T>::iterator p, typename std::vector<T>::iterator r) { if (p < r) { typename std::vector<T>::iterator q = p + (r - p) / 2; doMergeSort(A, p, q); doMergeSort(A, q + 1, r); doMerge(A, p, q, r); } } template <class T> bool MergeSort<T>::doSorting() { // copy rawArray to sortedArray SortTemplate<T>::sortedArray.resize(SortTemplate<T>::rawArray.size()); std::copy(SortTemplate<T>::rawArray.begin(), SortTemplate<T>::rawArray.end(), SortTemplate<T>::sortedArray.begin()); typename std::vector<T>::iterator p, r; p = SortTemplate<T>::sortedArray.begin(); r = SortTemplate<T>::sortedArray.end() - 1; // NOTE here substract 1 // do merge-sort doMergeSort(SortTemplate<T>::sortedArray, p, r); return true; } #endif
时间复杂度: O(n * lgn), 比插入排序的O(n^2) 小很多。
相关文章推荐
- python中实现二分查找,插入排序,归并排序,快速排序
- 插入排序的递归实现和二分查找递归实现,算法导论2.3-4和2.3-5
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 【C++】自己的快速排序与二分插入排序的封装
- 排序模板链表的插入存储和二分查找
- 插入,冒泡,选择,快速排序,二分查找
- 大二 第一次数据结构作业 (数组的排序,删除,查找,插入,合并)(线性表)
- 插入,冒泡,选择,快速排序,二分查找(Java版)
- 插入排序优化:简单插入排序->二分查找插入排序->二路插入排序->shell插入排序
- 插入排序的二分查找策略
- 排序----冒泡,选择,插入,二分查找
- Kotlin练习 之使用Kotlin实现:二分查找,选择排序,冒泡排序,快速排序
- 插入,冒泡,选择,快速排序,二分查找(Java版)
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 冒泡排序,简单插入排序,快速排序,二分查找的JAVA实现
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- 6字节数据 做 二分查找并插入排序
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 插入排序 二分查找插入排序