快速排序算法是一种高效的排序算法,提供了多种不同的实现方式。无论是基本实现、双边循环法还是挖坑法,快速排序都具有较好的时间复杂度和排序效率。不同的实现方式针对不同的场景和需求,可以选择适合的实现方式来提高算法性能。理解这三种实现方式的代码逻辑和优化技巧,有助于读者更好地理
- 快慢指针单循环
void quickSort(int arr[], int low, int high) {
if (low < high) {
// 选择基准元素
int pivot = arr[high];
int i = low - 1;
// 划分过程
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
// 递归排序
int partitionIndex = i + 1;
quickSort(arr, low, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, high);
}
}
- 快速排序的双边循环法实现
int partition(int arr[], int low, int high) {
// 选择基准元素
int pivot = arr[low];
int left = low;
int right = high;
while (left < right) {
// 从右边开始找到小于基准元素的值
while (left < right && arr[right] >= pivot)
right--;
// 从左边开始找到大于基准元素的值
while (left < right && arr[left] <= pivot)
left++;
// 交换左右两个元素
std::swap(arr[left], arr[right]);
}
// 将基准元素放在数组分割点的位置
std::swap(arr[low], arr[left]);
return left;
}
void quickSortBilateral(int arr[], int low, int high) {
if (low < high) {
int partitionIndex = partition(arr, low, high);
// 递归排序
quickSortBilateral(arr, low, partitionIndex - 1);
quickSortBilateral(arr, partitionIndex + 1, high);
}
}
- 快速排序的挖坑法实现
int partition(int arr[], int low, int high) {
// 选择基准元素
int pivot = arr[low];
int left = low;
int right = high;
while (left < right) {
// 从右边找到小于基准元素的值并填坑
while (left < right && arr[right] >= pivot)
right--;
arr[left] = arr[right];
// 从左边找到大于基准元素的值并填坑
while (left < right && arr[left] <= pivot)
left++;
arr[right] = arr[left];
}
// 将基准元素放入最终分割点
arr[left] = pivot;
return left;
}
void quickSortPit(int arr[], int low, int high) {
if (low < high) {
int partitionIndex = partition(arr, low, high);
// 递归排序
quickSortPit(arr, low, partitionIndex - 1);
quickSortPit(arr, partitionIndex + 1, high);
}
}