C++实现常用排序算法(快速排序、冒泡排序、希尔排序、折半插入排序、直接插入排序)

https://blog.csdn.net/mfcing/article/details/53582185 

#ifndef SORT_ALGORITHM_H_
#define SORT_ALGORITHM_H_
#include 
#include 
using std::cout;
using std::endl;
template
//T为排序序列元素类型,len为序列元素数目
class CSort
{
public:
	CSort(const T* arr);
	virtual~ CSort();
	//直接插入排序算法
	void InsertSort()const;
	//折半插入排序算法
	void BinaryInsertSort()const;
	//希尔排序算法
	void ShellSort(int dk[],const int& count)const;
	//冒泡排序算法
	void BubbleSort()const;
	//快速排序算法
	void QuickSort()const;
	//打印出数据
	void Show()const;
	//元素逆序输出
	void Scroll()const;
	//交换两个元素的值
	inline void Swap(T& t1,T& t2)const;
protected:
	//一趟希尔排序
	void ShellInsert(const int& dk)const;
	int Partition(int low,int high)const;
	void QSort(int low,int high)const;
private:
	T* buffer;//指向首地址,在整个过程中都不会改变之 
	int m_length;//元素数目
};
template
CSort::CSort(const T *arr):buffer(NULL),m_length(len)
{
	assert(arr&&len>0);
	buffer=const_cast(arr);
}
template
CSort::~CSort()
{
}
/*******************************************************************************************/
//直接插入排序
template
void CSort::InsertSort()const
{//arr 数组或指针首地址,len数组或指针中元素数目
	cout<<"开始进行直接插入排序----------------------------------------"<=0&&temp<*(p+j);--j)//循环知道找到插入位置
				*(p+j+1)=*(p+j);
			*(p+j+1)=temp;
		}
	}
}//时间复杂度为O(n^2)
/**********************************************************************************************/
//折半插入排序算法
template
void CSort::BinaryInsertSort()const
{
	cout<<"开始折半插入排序--------------------------------------------"<=high+1;--j)
			*(p+j+1)=*(p+j);
		*(p+high+1)=temp;
	}
}
/*********************************************************************************************************/
//希尔排序,对直接插入排序算法的一种改进
template
void CSort::ShellInsert(const int& dk)const
{//dk 希尔排序增量
	assert(dk>0);
	int i=0,j=0;
	T* p=buffer;
	for(i=dk;i0&&temp<*(p+j);j-=dk)
				*(p+j+dk)=*(p+j);
			*(p+j+dk)=temp;
		}
	}
}
	/*(增量数组的最后一个元素值必须为1,因为最后一次是进行一次直接插入排序)
	给出几个常用增量数组:
	dk[k]=2^(t-k+1)-1时(t为排序趟数),时间复杂度为:O(n^1.5)
	dk[k]=2^(t-k)+1
	dk[k]=0.5(3^(t-k)-1)
	希尔排序的时间复杂度没有确定值,增量序列有多种取法*/
template
void CSort::ShellSort(int dk[],const int& count)const
{//dk[]为增量数组,count为增量数组的元素数目
	cout<<"开始进行希尔排序------------------------------------------"<
void CSort::BubbleSort()const
{
	cout<<"开始进行冒泡排序------------------------------------------"<i;--j)
		{
			if(*(p+j)<*(p+j-1))
			{
				Swap(*(p+j),*(p+j-1));
				/*T temp=*(p+j);
				*(p+j)=*(p+j-1);
				*(p+j-1)=temp;*/
			}
		}
	}
}
/****************************************************************************************************/
//快速排序
template
int CSort::Partition(int low,int high)const//一趟快速排序
{
	T* p=buffer;
	T prikey=*(p+low);
	while(low=prikey)
			--high;
		*(p+low)=*(p+high);
		while(low
void CSort::QSort(int low,int high)const
{
	if(low
void CSort::QuickSort()const
{
	cout<<"开始快速排序--------------------------------------------------"<
void CSort::Show()const// 显示数组中的元素
{
	cout<<"打印元素序列:"<
void CSort::Scroll() const
{
	T* p=buffer;
	int low=0,high=m_length-1;
	while(low
inline void CSort::Swap(T &t1, T &t2) const
{
	T temp=t1;
	t1=t2;
	t2=temp;
}
#endif;

 

你可能感兴趣的:(c,c++)