int PartSort1(int* a, int left, int right)
{
int key = left;
int prev = left;
int last = right;
while (last > prev)
{
while (last>prev && a[last] >= a[key])//right找<key的数字
{
last--;
}
while (prev<last && a[prev] <= a[key])//left找>key的数字,会停在比key大的上面
{
prev++;
}
Swap(&a[prev], &a[last]);//交换了这两个
}
Swap(&a[key], &a[prev]);
return prev;
}
第二种方法:挖坑法
int PartSort2(int* a, int left, int right)
{
int key = a[left];
int keyi = left;
while (left < right)
{
while (right > left && a[right] >= key)
{
right--;
}
Swap(&a[right], &a[keyi]);
keyi = right;
while (left < right && a[left] <= key)
{
left++;
}
Swap(&a[left], &a[keyi]);
keyi = left;
}
a[keyi] = key;
return keyi;
}
第三种方法,快速指针前后推法
int PartSort3(int* a, int left, int right)
{
int prev = left;
int cur = left + 1;
int keyi = left;
while (cur <= right)
{
if (a[cur] < a[keyi] && ++prev != cur)
{
Swap(&a[prev], &a[cur]);
}
++cur;
}
Swap(&a[prev], &a[keyi]);
keyi = prev;
return keyi;
}
qsort的实现
void QuickSort(int* a, int left, int right)
{
if (left >= right)
return;
int keyi = PartSort2(a, left, right);
QuickSort(a, left, keyi - 1);
QuickSort(a, keyi + 1, right);
}
非递归版本
void QuickSortNonR(int* a, int left, int right)
{
//非递归用栈实现
ST stack;
STInit(&stack);
STPush(&stack, left);
STPush(&stack, right);
while (!STEmpty(&stack))
{
int r = STTop(&stack);
STPop(&stack);
int l = STTop(&stack);
STPop(&stack);
int keyi=PartSort2(a, l, r);
if (keyi - 1 > l)
{
STPush(&stack, l);
STPush(&stack, keyi-1);
}
if (keyi + 1 < r)
{
STPush(&stack, keyi + 1);
STPush(&stack, r);
}
}
}