排序算法模板函數實現(簡單類型)

先來看看普通int  類型的的實現

void merge(int*src, int *des, int low, int mid, int high) //歸併
{
	int i = low;
	int j = mid + 1;
	int k = low;

	while ((i <= mid) && (j <= high)) //將小的放到目的數組中
	{
		if (src[i] < src[j]) //那個臨時數組
		{
			des[k++] = src[i++];
		}
		else
		{
			des[k++] = src[j++];
		}
	}
	while (i <= mid)  //若還剩幾個尾部元素
	{
		des[k++] = src[i++];
	}

	while (j <= high) //若還剩幾個尾部元素
	{
		des[k++] = src[j++];
	}
}
//每次分爲兩路 當只剩下一個元素時,就不需要在劃分
void devide(int *src, int* des, int low, int high, int max) //劃分
{
	if (low == high) //只剩一個元素時,直接賦值給des
	{
		des[low] = src[low];
	}
	else
	{
		int mid = (low + high) / 2;
		int* tmp = (int*)malloc(sizeof(int)*max);

		//遞歸進行兩路,兩路的劃分 
		//當剩下一個元素的時,遞歸劃分結束,然後開始merge歸併操作
		if (tmp != NULL)
		{
			devide(src, tmp, low,	  mid,  max);
			devide(src, tmp, mid + 1, high, max);
			merge(tmp, des, low,	  mid,  high);  //調用歸併函數進行歸併
		}

		free(tmp);
	}
}


void mergesort(int* src, int len)
{
	devide(src, src, 0, len - 1, len);
}
然後在這個基礎上 改進改進

就成了下面的樣子

template <typename T>
void merge(T* src, T * des, int low, int mid, int high) //歸併
{
	int i = low;
	int j = mid + 1;
	int k = low;

	while ((i <= mid) && (j <= high)) //將小的放到目的數組中
	{
		if (src[i] < src[j]) //那個臨時數組
		{
			des[k++] = src[i++];
		}
		else
		{
			des[k++] = src[j++];
		}
	}

	while (i <= mid)  //若還剩幾個尾部元素
	{
		des[k++] = src[i++];
	}
	while (j <= high) //若還剩幾個尾部元素
	{
		des[k++] = src[j++];
	}
}
//每次分爲兩路 當只剩下一個元素時,就不需要在劃分
template <typename T>
void devide(T *src, T* des, int low, int high, int max) //劃分
{
	if (low == high) //只剩一個元素時,直接賦值給des
	{
		des[low] = src[low];
	}
	else
	{
		int mid = (low + high) / 2;
		T* tmp = (T*)malloc(sizeof(T)*max);  //需要注意的就是這裏 使用malloc也是這個原因

		//遞歸進行兩路,兩路的劃分 
		//當剩下一個元素的時,遞歸劃分結束,然後開始merge歸併操作
		if (tmp != NULL)
		{
			devide(src, tmp, low, mid, max);
			devide(src, tmp, mid + 1, high, max);
			merge(tmp, des, low, mid, high);  //調用歸併函數進行歸併
		}

		free(tmp);
	}
}

template <typename T>
void mergesort(T* src, int len)
{
	devide(src, src, 0, len - 1, len);
}
template <typename T>
void printArray(T *src, int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << src[i] << " ";
	}
	cout << endl;
}
當然這個也挺簡單的,只需要聲明一下函數模版,然後把參數類型改成T, 但是這個對於對象的比較,還有多字符串的排序是無能爲力的,仍需改進,留坑


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章