利用分治策略优化快速排序

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)如果基准元素的位置大于 目标元素,则继续在左侧子

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值