1.快速排序算法
分治快速排序(Quick Sort)是一种基于分治法的排序算法,采用递归的方式将一个数组分割成小的子数组,并通过交换元素来使得每个子数组元素按照特定顺序排列,最终将整个数组排序。
快速排序的基本步骤:
(1)选择基准元素:从数组中选择一个元素作为基准(pivot)。
(2)分区操作:将数组分成两个部分,左边的部分所有元素都小于基准元素,右边的部分所有元素都大于基准元素。此时基准元素已经排好序。
(3)递归排序:对基准元素左侧和右侧的子数组递归进行快速排序。
快速排序的核心思想:
- 分治法:通过每次选择一个基准元素,将数组分割成两个子数组,然后递归地对两个子数组进行排序。
- 每次选择基准元素后,通过分区将数组划分为两个部分,左侧部分的元素都小于基准,右侧部分的元素都大于基准。
- 递归对子数组进行排序,直到每个子数组的长度为 1 或 0,排序完成。
void mergeSort(vector<int>& num, int l, int r) {
if(l >= r) return; // 递归终止条件:区间长度为0或1时无需排序
// 步骤1:随机选择基准值key
int key = rannum(num, l , r);
// 步骤2:三路划分(小于key / 等于key / 大于key)
int left = l - 1, right = r + 1, i = l;
while(i < right)
{
if(num[i] < key) swap(num[++left], num[i++]);
else if(num[i] == key) i++;
else swap(num[--right], num[i]);
}
// 步骤3:递归排序“小于区”和“大于区”(“等于区”已有序,无需处理)
mergeSort(num, l, left);
mergeSort(num, right, r);
}
int rannum(vector<int>& num, int left, int right) {
int r = rand(); // 生成随机数
return num[r % (right - left + 1) + left];
}
2.快速选择算法
快速选择算法(Quickselect) 是一种基于快速排序(Quick Sort)的算法,用于在未排序的数组中找到第 k 小(大)的元素。与快速排序不同,快速选择只对包含第 k 小(大)元素的部分进行排序,而不需要对整个数组进行排序,因此它的时间复杂度通常较低。
快速选择的核心思想是:
(1)与快速排序一样,通过选择一个“基准”元素并进行分区(Partition)操作,将数组分成左右两个部分。
(2)如果基准元素的位置正好是 目标元素,则基准元素即为第 k 小的元素。
(3)如果基准元素的位置小于目标元素,则继续在右侧子数组中查找第 k 小元素。
(4)如果基准元素的位置大于 目标元素,则继续在左侧子

最低0.47元/天 解锁文章
683

被折叠的 条评论
为什么被折叠?



