主流排序算法(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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章