複習幾種排序算法,並且放到類裏實現,可以直接用。
/*
用模板實現排序的類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));
}
複習模板的使用和排序方法,希望對大家有用。