单趟排序:将比key小和相等的放在左边,将比key大和相等的放到右边
单趟排序的变形
1.hoare法,2.刨坑法,3.前后指针法。
hoare法
最右边做key,左边先走;左边做key,右边先走。
void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int HoareSort(int *a, int begin,int end)
{
//end做key,左边先走,begin做key,右边先走
int key = a[end];
int keyindex = end;
while (begin < end)
{
//begin找大
while (begin < end && a[begin] <= key)
{
++begin;
}
while (begin < end && a[end] >= key)
{
--end;
}
Swap(&a[begin], &a[end]);
}
Swap(&a[begin], &a[keyindex]);
return begin;
}
刨坑法
key=6
int PitSort(int *a, int begin, int end)
{
int key = a[end];
while (begin < end)
{
//begin找大
while (begin < end && a[begin] <= key)
{
++begin;
}
a[end] = a[begin];//找到大扔到右边的坑里去
while (begin < end && a[end] >= key)
{
--end;
}
a[begin] = a[end];//找到小就扔到左边的坑里去
}
a[begin]=key;
return begin;
}
3. 前后指针版本
//前后指针版本
int PrevCurSort(int *a, int begin, int end)
{
int cur = begin;
int prev=begin-1;
int key = a[end];
while (cur < end)//遇到key的位置就结束了
{
if (a[cur] < key && ++prev != cur)
Swap(&a[cur], &a[prev]);
++cur;
}
++prev;
Swap(&a[prev],&a[end]);
return prev;
}