学习导航
一、快排思想介绍
二、Hoare法介绍
所谓“移动”就是如下过程:
②疑难解答
③代码呈现
int PartSort(int* arr, int left, int right)
{
int key = arr[left];
int keyi = left;
while (left < right) //(1)
{
while (left < right && arr[right] >= key) //(2)
right--;
while (left < right && arr[left] <= key)
left++;
swap(&arr[left], &arr[right]); //(3)
}
swap(&arr[keyi], &arr[right]);
return right; //(4)
}
void QuickSort(int* arr, int left, int right)
{
if (left >= right)
return;
int keyi = PartSort(arr, left, right); //(4)
QuickSort(arr, left, keyi - 1);
QuickSort(arr, keyi + 1, right);
}
三、挖坑法介绍
③代码呈现
int PartSort(int* arr, int left, int right)
{
int hole = left; //(1)
int key = arr[left];
while (left < right)
{
while (left < right && arr[right] >= key)
right--;
arr[hole] = arr[right];
hole = right; //(2)
while (left < right && arr[left] <= key)
left++;
arr[hole] = arr[left];
hole = left;
}
arr[hole] = key; //(3)
return hole;
}
void QuickSort(int* arr, int left, int right)
{
if (left >= right)
return;
int keyi = PartSort(arr, left, right);
QuickSort(arr, left, keyi - 1);
QuickSort(arr, keyi + 1, right);
}
④代码剖析
四、前后指针法介绍
②代码呈现
int PartSort(int* arr, int left, int right)
{
int pre = left; //(1)
for (int cur = left + 1; cur <= right; cur++)
{
if (arr[cur] < arr[left])
swap(&arr[cur], &arr[++pre]); //(2)
}
swap(&arr[pre], &arr[left]); //(3)
return pre;
}
void Quicksort(int* arr, int left, int right)
{
if (left >= right)
return;
int keyi = Partsort1(arr, left, right);
Quicksort(arr, left, keyi - 1);
Quicksort(arr, keyi + 1, right);
}
五、对快排的优化
①key值的取法
下面展示三数取中的代码:
int GetmidIndex(int* arr, int left, int right)
{
int mid = left + ((right - left) >> 1);
if (arr[left] <= arr[right])
{
if (arr[mid] < arr[left])
return left;
else if (arr[mid] > arr[right])
return right;
else
return mid;
}
else
{
if (arr[mid] > arr[left])
return left;
else if (arr[mid] < arr[right])
return right;
else
return mid;
}
}