一. 单向扫描分区法
void quickSort1(int arr[],int L,int R)
{
if (L > R)return;
int pivot = arr[L];
int left = L;
int right = R;
while (left <= right)
{
if (arr[left] <= pivot)
{
left++;
}
else
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
right--;
}
}
int tmp = arr[L];
arr[L] = arr[right];
arr[right] = tmp;
quickSort1(arr, L, right - 1);
quickSort1(arr, right + 1, R);
}
二.双向扫描分区法
双向扫描分区法
void quickSort2(int arr[], int L, int R)
{
if (L > R)return;
int pivot = arr[L];
int left = L;
int right = R;
while (left <= right)
{
while (left <= right && arr[left] <= pivot)
{
left++;
}
while (left <= right && arr[right] >= pivot)
{
right--;
}
if (left <= right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
int tmp = arr[L];
arr[L] = arr[right];
arr[right] = tmp;
quickSort2(arr, L, right - 1);
quickSort2(arr, right + 1, R);
}
三. 三分法(适用于重复比较多的情况下)
//三指针分区法
void quickSort3(int arr[], int L, int R)
{
if (L > R)return;
int pivot = arr[L];
int left = L+1;
int right = R;
int equal = left;
while (left <= right)
{
if (arr[left] < pivot)
{
int tmp = arr[left];
arr[left] = arr[equal];
arr[equal] = tmp;
left++;
equal++;
}
else if (arr[left] == pivot)
{
left++;
}
else if (arr[left] > pivot)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
right--;
}
}
int tmp = arr[L];
arr[L] = arr[equal - 1];
arr[equal - 1] = tmp;
quickSort3(arr, L, equal - 2);
quickSort3(arr, right + 1, R);
}