快速排序
(这里参考自 狄泰 数据结构课程)
-
基本思想
任取一个元素作为基准, 将数组分为两部分,
一边序列是小于或等于 该基准
一边序列是大于该基准
基准元素排再该序列中间
将两边序列又重复以上动作知道所有元素排好序 (递归思想)看下图
-
直接上代码
template <typename T>
void Sort::Quick(T array[], int len, bool min2max) //对外使用接口
{
Quick(array, 0, len-1, min2max);
}
template <typename T>
void Sort::Quick(T array[], int begin, int end, bool min2max)
{
if(begin < end)
{
int mid = partition(array, begin, end, min2max); //取开头元素为基准 将两边元素分开,返回基准元素位置
Quick(array, begin, mid-1, min2max); //左边序列进入排序
Quick(array, mid+1, end, min2max); //右边序列进入排序
}
}
template <typename T>
int Sort::partition(T array[], int begin, int end, bool min2max)
{
T e = array[begin]; //取开头元素为基准
while(begin < end)
{
while(((begin < end) && (min2max ? (array[end] > e) : (array[end] < e))))
{
end--; //若从小到大排序,只要右边未找到小于基准元素就下边往前移
}
Swap(array[begin], array[end]); //找到交换位置
while(((begin < end) && (min2max ? (array[begin] <= e) : (array[begin] >= e))))
{
begin++; //同理
}
Swap(array[begin], array[end]); //同理
}
// array[begin] = e;
return begin; //返回基准元素位置
}