网上讨论快排算法的文章很多,本文的亮点是:
1,使用GP思想写的算法框架
2,以标准模板库的容器存储数据,可以存任意类型数据
3,容器类型可以变换
#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>
#include <string>
#include <deque>
template<typename Container, typename Compare>
void quick_sort(
typename Container::iterator& begin,
typename Container::iterator& end,
typename Compare& less_compare) {
typedef typename Container::value_type value_type;
typedef typename Container::iterator iterator_type;
iterator_type mid = pivot_compare<Container, Compare>(begin, end, less_compare);
if (begin < mid) {
quick_sort<Container, Compare>(begin, mid, less_compare);
}
if (end > mid+1)
{
quick_sort<Container, Compare>(mid+1, end, less_compare);
}
}
template<typename Container, typename Compare>
typename Container::iterator pivot_compare(
typename Container::iterator& begin,
typename Container::iterator& end,
typename Compare& less_compare) {
typedef typename Container::value_type value_type;
typedef typename Container::iterator iterator_type;
value_type pivot = *begin;
iterator_type mid = begin;
iterator_type first = begin+1;
iterator_type last = end-1;
while (first <= last) {
while (first <= last) {
if (less_compare(*last,pivot))
{
*mid = *last;
mid = last;
break;
} else {
last--;
continue;
}
}
while (first <= last) {
if (!less_compare(*first, pivot))
{
*mid = *first;
mid = first;
break;
} else {
first++;
continue;
}
}
}
*mid = pivot;
return mid;
}
template<typename data_container>
void test(data_container& container) {
typedef typename data_container::value_type data_type;
random_shuffle(container.begin(), container.end());
std::cout << "---------origin data--------" <<std::endl;
std::copy(container.begin(), container.end(), std::ostream_iterator<data_type>(std::cout, " "));
std::cout << std::endl;
typedef std::less<data_container::value_type> less_compare;
quick_sort<data_container, less_compare>(container.begin(), container.end(), less_compare());
std::cout << "---------sorted data--------" <<std::endl;
std::copy(container.begin(), container.end(), std::ostream_iterator<data_type>(std::cout, " "));
std::cout << std::endl;
}
int main(int argc, char* argv[])
{
// string vector container
{
char* data[] = {"ab","bb","abcd","ddd","eab","ced"};
typedef std::string data_type;
typedef std::vector<data_type> data_container;
data_container container(&data[0], &data[0]+_countof(data));
test(container);
}
// integer vector container
{
int data[] = {666,6,89,111,321,9,45};
typedef int data_type;
typedef std::vector<data_type> data_container;
data_container container(&data[0], &data[0]+_countof(data));
test(container);
}
// integer deque container
{
int data[] = {666,6,89,111,321,9,45};
typedef int data_type;
typedef std::deque<data_type> data_container;
data_container container(&data[0], &data[0]+_countof(data));
test(container);
}
return 0;
}