hoare法
首先我们来看它的基本思路:
第一步:选择待排序数组中的三个值,分别是首尾还有中值,start,end 和mid
第二步:对三个数进行排序,从小到大,
第三步:保护基准值,swap(src + mid, src + end - 1);也就是基准值和倒数第二个元素交换
第四步:a = start + 1, b = end - 2,b向前找比基准值小的,a向后找比基准值大的,找到之后 交换所指向的值,然后将基准值和a指向的值交换 (因为是从小到大排序a找的大的,应该在数组后面所以基准值和它换),产生左边的都比基准值小,右边的都比基准值大,然后a作为二叉树的根返回,重复上面四步操作,直到类似形状的二叉树被遍历完为止
代码实现:
int hoareway(int* src, int start,int end)
{
int a = start + 1, b = end - 2;
int mid = (start + end) / 2;
if (src[start] > src[mid])
{
swap(src + start, src + mid);
}
if (src[mid] > src[end])
{
swap(src + mid, src + end);
}
if (src[start] > src[mid])
{
swap(src + start, src + mid);
/*上面是三数排序部分*/
}
if (end-mid<=2)
{
return mid;
/*如果小于4个数直接返回输出*/
}
/*保护基准值*/
swap(src + mid, src + end - 1);
while (a <= b)
{
while (a < end-1 && src[a] <= src[end-1])
{
a++;
}
while (b > 0 && src[b] >= src[end-1])
{
b--;
}
if (a == b && (a == 1 || a == end-1))
{
break;
/*一种是找到同一个值,一种是找到了已经三数排好的地方,此时就不用排*/
}
if (a < b)
{
swap(src + a, src + b);
/* 交换*/
}
}
swap(src + a, src + end - 1);
return a;
}
void dealquicksort(int *src, int start, int end)
{
int mid;
if (start<end)
{
mid = hoareway( src, start, end);
dealquicksort( src, start, mid-1);
dealquicksort(src, mid + 1, end);
}
}
void quicksort(int *src, int n)
{
//快速排序
dealquicksort(src, 0, n-1);
}
如果递归思想有不明白请看https://blog.csdn.net/weixin_43447989/article/details/100054493
EOF