單趟排序:將比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;
}