簡單模板排序的實現(回顧排序)

複習幾種排序算法,並且放到類裏實現,可以直接用。

/*
	用模板實現排序的類Sort
	簡單的把幾個常用的排序方法加到Sort類裏面
	其中包含冒泡排序,選擇排序,快速排序,歸併排序
*/
template<class T>
class Sort{
public:
	// 冒泡排序
	static void BubbleSort(T* array, int size);
	// 選擇排序
	static void SelectSort(T* array, int size);
	// 快速排序
	static void QuickSort(T* array, int left, int right);
	// 歸併排序
	static void Merge(T* array, int left, int mid, int right);
	static void MergeSort(T* array, int left, int right);
private:
	// 交換元素函數
	static void Swap(T* array, int a, int b);
};

// 交換數組裏面的元素
template<class T>
void Sort<T>::Swap(T* array, int a, int b)
{
	T temp = array[a];
	array[a] = array[b];
	array[b] = temp;
}

// 冒泡排序
template<class T>
void Sort<T>::BubbleSort(T* array, int size)
{
	for (int i = 0; i < size; i++)
	{
		for (int j = 1; j < size; j++)
		{
			if (array[j] < array[j - 1])
			{
				Swap(array, j, j - 1);
			}
		}
	}
}

// 選擇排序
template<class T>
void Sort<T>::SelectSort(T* array, int size)
{
	int minIndex = 0;
	for (int i = 0; i < size; i++)
	{
		minIndex = i;
		for (int j = i + 1; j < size; j++)
		{
			if (array[minIndex] > array[j])
			{
				minIndex = j;
			}
		}
		if (minIndex != i)
		{
			Swap(array, i, minIndex);
		}
	}
}

// 快速排序
template<class T>
void Sort<T>::QuickSort(T* array, int left, int right)
{
	if (left < right)
	{
		int i = left - 1, j = right + 1;
		T mid = array[(left + right) / 2];
		while (true)
		{
			while (array[++i] < mid);
			while (array[--j] > mid);
			if (i >= j)
			{
				break;
			}
			Swap(array, i, j);
		}
		QuickSort(array, left, i - 1);
		QuickSort(array, j + 1, right);
	}
}

 /*
	方式是先兩兩排序,組合,再排序
	例如 54 26 35 46 85 95 68
	先54-26 35-46 85-95 68
	再26-54 - 35-46   68 - 85-95
	再26-35-46-54 - 68-85-95 最後整合
 */
// 歸併組合
template<class T>
void Sort<T>::Merge(T* array, int left, int mid, int right)
{
	T* temp = new T[right - left + 1];
	int i = left, j = mid + 1, m = 0;
	while (i <= mid && j <= right)
	{
		if (array[i] < array[j])
		{
			temp[m++] = array[i++];
		}else {
			temp[m++] = array[j++];
		}
	}
	while (i <= mid)
	{
		temp[m++] = array[i++];
	}
	while(j <= right)
	{
		temp[m++] = array[j++];
	}
	for (int n = left, m = 0; n <= right; n++, m++)
	{
		array[n] = temp[m];
	}
	delete temp;
}

// 歸併排序
template<class T>
void Sort<T>::MergeSort(T* array, int left, int right)
{
	if (left < right)
	{
		int mid = (left + right) / 2;
		MergeSort(array, left, mid);
		MergeSort(array, mid + 1, right);
		Merge(array, left, mid, right);
	}
}

測試調用

void main()
{
	int number[] = {5, 65, 56, 89, 797, 54, 68, 79, 103};
	/*打印方法沒有寫*/
	//printArray(number, sizeof(number) / sizeof(int));
	/*換排序算法*/
	//Sort<int>::SelectSort(number, sizeof(number) / sizeof(int));
	//Sort<int>::MergeSort(number, 0, sizeof(number) / sizeof(int) - 1);
	//printArray(number, sizeof(number) / sizeof(int));
}

複習模板的使用和排序方法,希望對大家有用。




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