主流排序算法(C++实现)

这里包含了很多排序算法:冒泡、二分插入排序、快排、归并、堆排

#include <iostream>

template<typename T>
void Sort_Bubble(T * pData, int b, int e)
{
	if(b >= e)
		return;
	int n = e - b + 1;
	pData += b;
	for(int i = n - 1; i > 0; --i)
	{
		for(int j = 0; j < i; ++j)
		{
			if(pData[j] > pData[j + 1])
			{
				pData[j] = pData[j] + pData[j + 1];
				pData[j + 1] = pData[j] - pData[j + 1];
				pData[j] = pData[j] - pData[j + 1];
			}
		}
	}
}

template<typename T>
void Sort_Insert(T * pData, int b, int e)
{
	if(b >= e)
		return;
	int n = e - b + 1;
	pData += b;
	for(int i = 0; i < n; ++i)
	{
		int begin = 0;
		int end = i - 1;
		bool isFind = false;
		while(begin <= end)
		{
			int half = (begin + end) / 2;
			if(pData[half] < pData[i])
				begin = half + 1;
			else if(pData[half] > pData[i])
				end = half - 1;
			else
				isFind = true;
		}
		if(!isFind)
		{
			T temp = pData[i];
			for(int j = i; j > begin; --j)
				pData[j] = pData[j - 1];
			pData[begin] = temp;
		}
	}
}


//快排(选择一个位置上的数,比这个大的放在右边,小的放在左边)
template<typename T>
void Sort_Quick(T * pData, int b, int e)
{	
	if(b >= e)
		return;
	int pos = b;
	for(int i = b + 1; i <= e; ++i)
	{
		if(pData[i] < pData[b])
		{
			++pos;
			//不定义中间变量容易出错,需要加以判断pos是否=i
			if(i != pos)
			{
				pData[pos] = pData[pos] + pData[i];
				pData[i] = pData[pos] - pData[i];
				pData[pos] = pData[pos] - pData[i];
			}
		}
	}
	if(pos != b)
	{
		pData[pos] = pData[pos] + pData[b];
		pData[b] = pData[pos] - pData[b];
		pData[pos] = pData[pos] - pData[b];
	}
	
	Sort_Quick(pData, b, pos - 1);
	Sort_Quick(pData, pos + 1, e);
}

template<typename T>
//void Sort_MergeIn(T * pData, int b, int e)
//{
//	Sort_Merge( pData,  b,  e);
//}
void Sort_Merge(T * pData, int b, int e)
{
	if(b >= e )
		return;
	int half = (b + e) / 2;
	Sort_Merge(pData, b, half);
	Sort_Merge(pData, half + 1, e);
	int n = e - b + 1;
	T * Help = new T[n];
	int pos1 = b;
	int pos2 = half + 1;
	int i = 0;
	for( ; pos1 <= half && pos2 <= e; ++i)
	{
		if(pData[pos1] < pData[pos2])
			Help[i] = pData[pos1++];
		else if(pData[pos1] > pData[pos2])
			Help[i] = pData[pos2++];
		else
		{
			Help[i] = Help[i + 1] = pData[pos1++];
			++pos2;
			++i;
		}
	}
	for( ; pos1 <= half; ++i)
	{
		Help[i] = pData[pos1++];
	}
	for( ; pos2 <= e; ++i)
	{
		Help[i] = pData[pos2++];
	}
	for(int j = 0; j < n; ++j)
	{
		pData[b++] = Help[j];
	}
	delete [] Help;
}

//堆排序
template<typename T>
void HeapAdjust(T * a,int i,int size)  //调整堆 
{
    int lchild = 2 * i;       
    int rchild = 2 * i + 1;     
    int max = i;      
    //如果i是叶节点就不用进行调整 
    if(i <= size/2)          
    {
        if(lchild <= size && a[lchild] > a[max])
        {
            max = lchild;
        }    
        if(rchild <= size && a[rchild] > a[max])
        {
            max = rchild;
        }
        if(max != i)
        {
            T temp = a[max];
			a[max] = a[i];
			a[i] = temp;
            HeapAdjust(a, max, size); 
        }
    }        
}
template<typename T> 
void Sort_Heap(T * pData,int realsize) 
{
	int size = realsize + 1;
	T * a = new T[size];
	a[0] = 0;
	for(int i = 0; i < realsize; ++i)
	{
		a[i + 1] = pData[i];
	}
	
    for(int i = size/2; i >= 1; --i)    
    {
        HeapAdjust<T>(a, i, size);    
    }    
    for(int i = size - 1; i >= 1; --i)
    {
		//交换堆顶和最后一个元素
		T temp = a[1];
		a[1] = a[i];
		a[i] = temp;
		//将余下元素重新建立为大顶堆 
		HeapAdjust<T>(a, 1, i-1); 
    }

	for(int i = 0; i < realsize; ++i)
	{
		pData[i] = a[i + 1];
	}

	delete [] a;
}

void main()
{
	int Array[5] = {3, 2, 7, 6, 4};

	//Sort_Bubble<int>(Array, 2, 4);

	//Sort_Insert<int>(Array, 1, 4);

	//Sort_Quick<int>(Array, 1, 4);

	//Sort_Merge<int>(Array, 1, 4);

	Sort_Heap<int>(Array, 6);
	system("pause");
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值