目录
快排递归
快速排序hoareba版(左右指针法)
思路:
注意
左边做key,可以让左边先走吗?
不可以
左边做key必须让右边先走,右边(right)是找比key小的,找到小的停下来,即使相遇也能保证right位置的值小于key的
单趟实现代码
基于上面的思路可以先实现hoare的单趟排序
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
//快排hoare版 单趟
void QuickSort(int* a,int begin ,int end){
//选左边做Key ,让右边先走
int Key = left;
while (left < right)
{
//right可能越界 当为1,2,3,4,5……10,right可能越界
//找小
while (left < right && a[right] >= a[Key])
{
right--;
}
//找大
while (left < right && a[left] <= a[Key])
{
left++;
}
//找到后交换
Swap(&a[left],&a[right]);
}
//相遇后交换key位置的值
Swap(&a[left], &a[Key]);
}
多趟(递归)
单趟排序后可以得到如下结果,然后在继续重复(递归)单趟排序
直到只有一个(数)区间就停止递归
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
//快排递归
void QuickSort(int* a,int begin ,int end){
//递归结束的条件
if (begin >= end)
return;
int left = begin, right = end;
//选左边做Key ,让右边先走
int Key = left;
while (left < right)
{
//right可能越界 当为1,2,3,4,5……10,right可能越界
//找小
while (left < right && a[right] >= a[Key])
{
right--;
}
//找大
while (left < right && a[left] <= a[Key])
{
left++;
}
Swap(&a[left],&a[right]);
}
Swap(&a[left], &a[Key]);
//找到相遇的
//int meeti = left;
//在递归这两个区间
//[begin,metti-1] metti [metti+1,end]
QuickSort(a,begin,left-1);
QuickSort(a,left+1,end);
}
快速排序挖坑法
思路
单趟实现代码
void QuickSort(int* a, int left, int right)
{
int Hole = a[left];
while (left < right)
{
//找小
while (left < right && a[right] >= Hole)
right--;
//找到后把right的值放到坑里,左边成为新的坑
a[left] = a[right];
//找大
while (left < right && a[left] <= Hole)
left++;
//找到后把left的值放到坑里,右边成为新的坑
a[right] = a[left];
}
//相遇后填坑
a[left] = Hole;
}
多趟(递归)
和前面Hoare递归非常类似 递归左边和右边