浅谈:从经典算法到实战优化的案例分析

有经验的的读者应该会有警觉性,这颗递归树在一些特殊数据情况下很有可能会由树 退化成链。从而使 O(nlogn) 的复杂度退化到 O(n^2)。

这样我们快速排序的效果就大打折扣了。

为了解决这个问题我们回到我们之前的处理方式,我们是直接选取问题序列的第一个元素的。因此很容易发现当数据是有序,或者重复数值很多的时候递归树就会往单个方向退化。因此我们可以使用 随机选点的方式,来使数据不会一边倒的集中。

例题

最后我们来一道排序数组的模板题作为练习。

复制代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        srand((unsigned)time(NULL));
        quickSort(nums, 0, nums.size() - 1);
        return nums;
    }
​
private:
    void quickSort(vector<int>& arr, const int first, const int last) {
        if (first >= last) {
            return;
        }
​
        // (优化)随机取一个数
        int randIdx = first + (rand() % (last - first + 1));
        swap(arr[randIdx], arr[first]);
​
        int left   = first;
        int right  = last;
        int border = arr[left];
        while (left < right) {
            while (left < right && border <= arr[right]) {
                right += -1;
            }
            arr[left] = arr[right];
            while (left < right && border >= arr[left]) {
                left += 1;
            }
            arr[right] = arr[left];
        }
        arr[left] = border;
​
        const int borderIdx = left;
        quickSort(arr, first, borderIdx - 1);
        quickSort(arr, borderIdx + 1, last);
    }
};

今天的文章分享到这里就结束了,希望认真阅读全文的小伙伴,都能有所收获哦!

相关推荐
刘马想放假3 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠4 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦10 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠11 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾11 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82111 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q12 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒12 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记12 天前
单项不带头不循环链表
数据结构·链表
小糯米60112 天前
JS 数组
数据结构·算法·排序算法