[Algorithms] 分治算法(二分查找, 合并排序, 插入排序, 快速排序(coming))

 

分治算法::二分查找

 


 

template 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: [email protected] */ #ifndef _dl_merge_h #define _dl_merge_h #include "dl_sort_template.h" template class InsertSort : public SortTemplate { public: InsertSort() {} InsertSort(std::istream& is) : SortTemplate(is) {} bool doSorting(); }; template bool InsertSort::doSorting() { SortTemplate::sortedArray.resize(SortTemplate::rawArray.size()); std::copy(SortTemplate::rawArray.begin(), SortTemplate::rawArray.end(), SortTemplate::sortedArray.begin()); if (!NDEBUG) { SortTemplate::printRawArray(); } typename std::vector::iterator j, i; for (j = SortTemplate::sortedArray.begin() + 1; j != SortTemplate::sortedArray.end(); j++) { i = j - 1; while ((i >= SortTemplate::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: [email protected] */ #ifndef _dl_merge_sort_h #define _dl_merge_sort_h #include "dl_sort_template.h" #include #include #include template class MergeSort : public SortTemplate { public: MergeSort() {} MergeSort(std::istream& is) : SortTemplate(is) {} bool doSorting(); private: void doMerge(std::vector& A, typename std::vector::iterator p, typename std::vector::iterator q, typename std::vector::iterator r); void doMergeSort(std::vector& A, typename std::vector::iterator p, typename std::vector::iterator r); }; template void MergeSort::doMerge(std::vector& A, typename std::vector::iterator p, typename std::vector::iterator q, typename std::vector::iterator r) { if (!(p <= q && q < r)) return; int n1 = q - p + 1; int n2 = r - q; std::vector 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::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 void MergeSort::doMergeSort(std::vector& A, typename std::vector::iterator p, typename std::vector::iterator r) { if (p < r) { typename std::vector::iterator q = p + (r - p) / 2; doMergeSort(A, p, q); doMergeSort(A, q + 1, r); doMerge(A, p, q, r); } } template bool MergeSort::doSorting() { // copy rawArray to sortedArray SortTemplate::sortedArray.resize(SortTemplate::rawArray.size()); std::copy(SortTemplate::rawArray.begin(), SortTemplate::rawArray.end(), SortTemplate::sortedArray.begin()); typename std::vector::iterator p, r; p = SortTemplate::sortedArray.begin(); r = SortTemplate::sortedArray.end() - 1; // NOTE here substract 1 // do merge-sort doMergeSort(SortTemplate::sortedArray, p, r); return true; } #endif 

时间复杂度: O(n * lgn), 比插入排序的O(n^2) 小很多。

 

你可能感兴趣的:(Algorithms,算法,iterator,class,merge,n2)