温故而知新【快速排序】

#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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。