快速排序的實現--挖坑法
阿新 • • 發佈:2019-01-08
//*********************挖坑法(快排的一種實現方式)************************
int
PartSort(int
*a,
intleft,
intright)
{
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);
}