目录
Hoare 法
int GetMidIndex(int* arr, int left, int right)
{
int mid = (left + right) / 2;
if (arr[left] < arr[mid])
{
if (arr[mid] < arr[right])
return mid;
else if (arr[left] > arr[right])
return left;
else
return right;
}
else
{
if (arr[mid] > arr[right])
return mid;
else if (arr[left] < arr[right])
return left;
else
return right;
}
}
int PartQuickSort_hoare(int* arr, int left, int right)
{
int key = GetMidIndex(arr, left, right);
Swap(&arr[key], &arr[left]);
key = left;
while (left < right)
{
while (left < right && arr[right] > arr[key])
right--;
while (left < right && arr[left] < arr[key])
left++;
if (left < right)
Swap(&arr[left], &arr[right]);
}
int meet = left;
Swap(&arr[key], &arr[meet]);
return meet;
}
void QuickSort(int* arr, int size)
{
int left = 0;
int right = size - 1;
if (right - left <= 8)
{
InsertSort(arr + left, size);
}
else
{
int key = PartQuickSort_hoare(arr, left, right);
PartQuickSort_hoare(arr, left, key - 1);
PartQuickSort_hoare(arr, key + 1, right);
}
}
挖坑法
int PartQuickSort_hole(int* arr, int left, int right)
{
int hole = GetMidIndex(arr, left, right);
Swap(&arr[hole], &arr[left]);
hole = left;
int key = arr[hole];
while (left < right)
{
while (arr[right] > key)
right--;
arr[hole] = arr[left];
hole = right;
while (arr[left] < key)
left++;
arr[hole] = arr[left];
hole = left;
}
arr[hole] = key;
return hole;
}
指针法
int PartQuickSort_point(int* arr, int left, int right)
{
int mid = GetMidIndex(arr, left, right);
Swap(&arr[mid], &arr[left]);
int key = left;
int prev = left;
int cur = left + 1;
while (cur <= right)
{
if (arr[cur] <= arr[key])
{
prev++;
Swap(&arr[cur], &arr[prev]);
}
cur++;
}
Swap(&arr[prev], &arr[key]);
return prev;
}
快速排序非递归
void QuickSortNonR(int* arr, int size)
{
int left = 0;
int right = size - 1;
ST st;
StackInit(&st);
StackPush(&st, left);
StackPush(&st, right);
while (!StackEmpty(&st))
{
right = StackTop(&st);
StackPop(&st);
left = StackTop(&st);
StackPop(&st);
if (left >= right)
continue;
int key = PartQuickSort_hoare(arr, left, right);
StackPush(&st, left);
StackPush(&st, key - 1);
StackPush(&st, key + 1);
StackPush(&st, right);
}
StackDestroy(&st);
}