//*********************挖坑法(快排的一种实现方式)************************
int
PartSort(
int
*
a
,
int
left
,
int
right
)
{
int
key =
a
[
right
];
int
begin =
left
;
int
end =
right
;
while
(begin < end)
{
while
(begin < end &&
a
[begin] <= key)
//begin找比key大的
begin++;
if
(begin < end)
//找到且begin < end则把begin的值给end,begin成为新的坑
a
[end] =
a
[begin];
while
(begin < end &&
a
[end] >= key)
//end找比key小的
end--;
if
(begin < end)
//找到且begin < end则把end的值给begin,end成为新的坑
a
[begin] =
a
[end];
}
//出了循环:end可能和begin指向同一个,把key的值给begin或者end都可以
// end比begin小,则begin的位置一定是key的位置
//此处不做判断,所以直接把key的值给a[begin]
a
[begin] = key;
return
begin;
}
void
DigHoles(
int
*
a
,
int
left
,
int
right
)
{
assert
(
a
);
if
(
left
>=
right
)
return
;
int
mid = PartSort(
a
,
left
,
right
);
DigHoles(
a
,
left
, mid - 1);
DigHoles(
a
, mid + 1,
right
);
}
void
DigHolesTest()
{
//int arr[] = { 2, 0, 4, 9, 3, 6, 8, 7, 1, 5 };
int
arr[] = { 2, 5, 4, 9, 3, 5, 8, 7, 1, 5 };
int
_size =
sizeof
(arr) /
sizeof
(arr[0]);
DigHoles(arr, 0, _size - 1);
Print(arr, _size);
}