目录
思路:
1、从数列中挑出一个元素,称为“基准”(pivot)。
2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准大的摆在基准后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归(recursive)的把小基准值元素的子数列和大于基准值的子数列排序。
快排采用了分治策略,在快排中,主要工作集中在划分而不是合并子问题。
一、普通版本
int partition(int arr[], int left, int right)
{
// 设定基准值pivot
int pivot = left;
int index = pivot + 1;
for (int i = index; i <= right; i++)
{
if (arr[i] < arr[pivot])
{
swap(arr[i], arr[index]);
index++;
}
}
swap(arr[pivot], arr[index - 1]);
return index - 1;
}
void quickSort(int arr[], int left, int right)
{
if (left < right)
{
int partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, right);
}
}
二、简洁版本
int partition(vector<int> &v, int left, int right)
{
int index = left;
int pivot = v[right]; // 基准值pivot
for (int i = left; i < right; i++)
{
if (v[i] <= pivot)
swap(v[i], v[index++]);
}
swap(v[index], v[right]);
return index;
}
void quickSort(vector<int> &v, int left, int right)
{
if (left < right)
{
int partitionIndex = partition(v, left, right);
quickSort(v, left, partitionIndex - 1);
quickSort(v, partitionIndex + 1, right);
}
}