快速排序是一种常用的排序算法,其基本思想是通过一趟排序将数组分成两个部分,其中一部分的元素都比另一部分小,然后再分别对这两部分进行排序,直到整个数组有序。
具体步骤如下:
1. 选取一个元素作为基准值(pivot)。
2. 通过一趟排序,将数组中的元素重新排列,使得比基准值小的元素都在基准值的左边,比基准值大的元素都在基准值的右边。
- 使用两个指针i和j,分别指向数组的第一个元素和最后一个元素。
- 从右往左寻找第一个小于基准值的元素,将其与i指针所指的元素交换位置。
- 从左往右寻找第一个大于基准值的元素,将其与j指针所指的元素交换位置。
- 循环执行以上两步,直到i和j相遇。
- 最后将基准值与i指针所指的元素交换位置。
3. 对基准值左边的子数组和右边的子数组分别进行递归排序。
快速排序的优点是原地排序,不需要额外的存储空间;缺点是对于有序的数组排序效率较低,时间复杂度为O(n^2)。但是平均情况下,快速排序的时间复杂度为O(nlogn),性能较好。
模板代码:
#include <iostream>
#include <vector>
using namespace std;
int partition(vector<int>& nums, int left, int right) {
int pivot = nums[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (nums[j] <= pivot) {
i++;
swap(nums[i], nums[j]);
}
}
swap(nums[i+1], nums[right]);
return i+1;
}
void quicksort(vector<int>& nums, int left, int right) {
if (left < right) {
int pivot = partition(nums, left, right);
quicksort(nums, left, pivot - 1);
quicksort(nums, pivot + 1, right);
}
}
void printArray(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
cout << endl;
}
int main() {
vector<int> nums = {9, 2, 5, 1, 6, 8, 4, 3, 7};
int n = nums.size();
cout << "Original array: ";
printArray(nums);
quicksort(nums, 0, n-1);
cout << "Sorted array: ";
printArray(nums);
return 0;
}
这段代码使用了分治法的思想来进行快速排序。首先选择一个基准元素,将数组中比基准元素小的放在它的左边,比它大的放在右边,然后对左右两个子数组进行递归排序,直到子数组的大小为1或0。
在 partition
函数中,我们选择数组最后一个元素作为基准元素,并使用双指针法进行元素的交换,使得最终基准元素的位置正确。
在 quicksort
函数中,我们首先检查数组的大小,只有当数组的大小大于1时才需要进行排序。然后选择基准元素并调用 partition
函数,将数组分为两部分进行递归排序。
最后,在 main
函数中,我们创建一个测试数组并调用 quicksort
函数进行排序,然后打印排序后的结果。