温故而知新【快速排序】
#if !defined(_SORT_INCLUDED_H) #define _SORT_INCLUDED_H #include <iostream> /* 分别使用递归和循环来实现快速排序,虽然已经写了4年多代码了 但是发现一次性写的完整无误还真是...呵呵 author:davidsu33 datetime:2015-3-1 */ /* 快速排序,使用递归 */ template<class Iterator> void swap_value(Iterator l, Iterator r) { Iterator::value_type aValue; aValue = *l; *l = *r; *r = aValue; } template<class Iterator> void trace_vector(Iterator begin, Iterator end) { for(; begin <= end; ++begin) { std::cout<<*begin << ","; } std::cout<<std::endl; } template<class Iterator, class Compare> void quick_sort(Iterator begin, Iterator end) { typedef Iterator::distance_type DistanceType; typedef Iterator::value_type ValueType; Compare comp; if (end - begin <= 1) { return; } Iterator l = begin; Iterator r = end - 1; DistanceType midPos = (r - l) / 2; Iterator mid = begin + midPos; ValueType value = *mid;//确定这个数值的位置 //std::cout<< "value="<<value<<std::endl; //查找value排序后的位置,即左侧都小于value,右侧都大于value while(l < r) { for (; l < mid; ++l) { if (!comp(*l, value)) { *mid = *l; mid = l; break; } } for (; mid < r; --r) { if (!comp(value, *r)) { *mid = *r; mid = r; break; } } } *mid = value; //std::cout<<"mid pos:"<<mid - begin << std::endl; //value的位置已经确定,不再参与排序 quick_sort<Iterator, Compare>(begin, mid); quick_sort<Iterator, Compare>(mid+1, end); } /* 不使用递归来实现 */ #include <queue> //编码时少些了一个t的引用符号,导致排序错误 //编写算法的时候要特别注意啊 template<class Iterator> void find_self_pos(Iterator l, Iterator r, Iterator &t) { Iterator::value_type key = *t; while (l < r) { for (; l < t; ++l) { if (*l > key) { *t = *l; t = l; break; } } for (; t < r; --r) { if (*r < key) { *t = *r; t = r; break; } } } *t = key; } template<class Iterator> void quick_sort_for(Iterator begin, Iterator end) { if (end - begin <= 1) { return; } Iterator l = begin, r = end - 1; typedef std::pair<Iterator,Iterator> IntPair; std::queue<IntPair> mids; mids.push(IntPair(l, r)); while (!mids.empty()) { IntPair f = mids.front(); //m可以是迭代范围中的任何一个值,这里默认取的是中间值 Iterator m = f.first + (f.second - f.first)/2; find_self_pos(f.first, f.second, m); mids.pop(); if(m - f.first >= 1) mids.push(IntPair(f.first, m-1)); if(f.second -m >=1) mids.push(IntPair(m+1, f.second)); } } #endif
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。