// 快速排序挖坑法
int PartSort2(int* a, int left, int right)
{
int hole = left + rand() % (right - left + 1);
int key = a[hole];
swap(&a[hole], &a[left]);
hole = left;
while (left < right)
{
while (a[right] > a[hole] && right > left)
{
right--;
}
swap(&a[hole], &a[right]);
hole = right;
while (a[left] < a[hole] && left < right)
{
left++;
}
swap(&a[hole], &a[left]);
hole = left;
}
a[hole] = key;
return hole;
}
// 快速排序前后指针法
int PartSort3(int* a, int left, int right)
{
int keyi = left + rand() % (right - left + 1);
int key = a[keyi];
swap(&a[keyi], &a[left]);
int prev = left;
int cur = prev + 1;
while (cur <= right)
{
if (a[cur] < key && ++prev != cur)
{
swap(&a[cur], &a[prev]);
cur++;
}
else
{
cur++;
}
}
swap(&a[prev], &a[left]);
return prev;
}
void QuickSort(int* a, int left, int right)
{
if (left >= right)
{
return;
}
assert(a != NULL);
//int keyi = PartSort2(a, left, right);
//int keyi = PartSort3(a, left, right);
QuickSort(a, left, keyi - 1);
QuickSort(a, keyi + 1, right);
}
数据结构:快排挖坑和前后指针
最新推荐文章于 2024-09-15 22:05:05 发布