1. 基本思想
分治快速排序(Quick Sort)是一种基于分治法的排序算法,采用递归的方式将一个数组分割成小的子数组,并通过交换元素来使得每个子数组元素按照特定顺序排列,最终将整个数组排序。
快速排序的基本步骤:
- 选择基准元素:从数组中选择一个元素作为基准(pivot)。
- 分区操作:将数组分成两个部分,左边的部分所有元素都小于基准元素,右边的部分所有元素都大于基准元素。此时基准元素已经排好序。
- 递归排序:对基准元素左侧和右侧的子数组递归进行快速排序。
快速排序的核心思想:
- 分治法:通过每次选择一个基准元素,将数组分割成两个子数组,然后递归地对两个子数组进行排序。
- 每次选择基准元素后,通过分区将数组划分为两个部分,左侧部分的元素都小于基准,右侧部分的元素都大于基准。
- 递归对子数组进行排序,直到每个子数组的长度为 1 或 0,排序完成。
// 分区函数,返回基准元素的正确位置
int Partition(vector<int>& arr, int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为基准
int i = low - 1; // i 是小于基准元素的子数组的最后一个元素的索引
// 遍历数组,将小于基准的元素移动到数组的前面
for (int j = low; j < high; ++j) {
if (arr[j] < pivot) {
++i;
swap(arr[i], arr[j]);
}
}
// 将基准元素放到正确的位置
swap(arr[i + 1], arr[high]);
return i + 1; // 返回基准元素的索引
}
// 快速排序函数
void QuickSort(vector<int>& arr, int low, int high) {
if (low < high) {
// 找到基准元素的索引
int pi = Partition(arr, low, high);
// 递归排序基准元素左边和右边的子数组
QuickSort(arr, low, pi - 1); // 排序左边子数组
QuickSort(arr, pi + 1, high); // 排序右边子数组
}
}
2. 快速选择算法
快速选择算法(Quickselect) 是一种基于快速排序(Quick Sort)的算法,用于在未排序的数组中找到第 k
小(大)的元素。与快速排序不同,快速选择只对包含第 k
小(大)元素的部分进行排序,而不需要对整个数组进行排序,因此它的时间复杂度通常较低。<