快速排序:
template<class T>
void Quicksort(T array[],int left,int right)
{
if (left == right) return;
int mid = (left + right) / 2;
T center,temp;
int i = left, j = right;
if (array[left]>array[mid] && array[mid]>array[right])
{
center = array[mid];
array[mid] = array[right];
array[right] = center;
}
else if (array[mid]>array[left] && array[left]>array[right])
{
center = array[left];
array[left] = array[right];
array[right] = center;
}
else
center = array[right];
while (true)
{
if (array[j] >= center)j--;
if (array[i] <= center)i++;
if (j < i)break;
if (array[j]<center && array[i]>center)
{
temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
array[right] = array[i];
array[i] = center;
Quicksort<T>(array, left, j);
Quicksort<T>(array, i, right);
}
归并排序:
template <class T>
void mergesort(T array[], int left, int right)
{
if (left == right) return;
int mid = (left + right) / 2;
int i = left, j = mid+1,k=0;
mergesort<T>(array, left, mid);
mergesort<T>(array, mid+1, right);
T*newarray=new T[right-left+1];
while (i <= mid && j <= right)
{
if (array[i]<array[j])
newarray[k++] = array[i++];
else
newarray[k++] = array[j++];
}
while (i <= mid)
newarray[k++] = array[i++];
while (j <= right)
newarray[k++] = array[j++];
for (int n = 0; n <= right - left; n++)
array[left+n]=newarray[n];
delete newarray;
}
可以对自定义类型排序,但没有传入用于比较的函数指针或是函数对象,需要重载运算符才能直接调用。用于排序的array须支持使用[]随机访问。
快速排序中枢纽的选取采用三点取中法。