优选算法_分治_快速排序_归并排序_C++

一.题目解析

我们不使用内置的函数进行升序,并且时间复杂度是O(nlog(n))

随机数的取值

我们不选中间值等的取值方法,完全随机取值效率更好,证明略

cpp 复制代码
    srand(time(NULL));//随机数种子    
    int getrandom(vector<int>& nums,int l,int r)
    {

        return nums[rand()%(r-l+1)+l];
    }

算法一解析:分三组快速排序

选定一个关键数字key分为三组小于key的区间,等于key的区间,大于key的区间

怎么分呢?

再对左右区间进行排序,排序方法和第一步一样也就是递归实现,跟着代码走思路更加清晰

代码编写:

cpp 复制代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        srand(time(NULL));//随机数种子
        int n=nums.size();
        qsort(nums,0,n-1);
        return nums;
    }

    void qsort(vector<int>& nums,int l,int r)
    {
        if(l>=r)return ;//递归出口
        int i=l,left=l-1,right=r+1;
        int key=getrandom(nums,l,r);
        while(i<right)
        {
            if(nums[i]<key) swap(nums[i++],nums[++left]);
            else if(nums[i]==key) i++;
            else swap(nums[i],nums[--right]);
        }
        //现在数组就分为了三组[l,left][left+1,right-1][right.r]

        qsort(nums,l,left);//左区间排序
        qsort(nums,right,r);//右区间排序
        return;
    }
    int getrandom(vector<int>& nums,int l,int r)
    {
        return nums[rand()%(r-l+1)+l];
    }
};

算法二:归并排序

将数组mid分成两部分,将左区间排序,将右区间排序,归并两个有序数组

具体就三步

1.mid分为两数组

2.左数组排序

3.右数组排序

4.合并两个有序数组

代码编写:

cpp 复制代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        mergesort(nums,0,nums.size()-1);
        return nums;
    }

    void mergesort(vector<int>& nums,int left,int right)
    {
        if(left>=right)return;//递归出口
        int mid=left+(right-left)/2;//防止溢出
        //区间变成了[left,mid][mid+1,right]
        //左右区间排序
        mergesort(nums,left,mid);
        mergesort(nums,mid+1,right);
        //合并两个有序数组
        vector<int>tmp(right-left+1);
        int cur1=left,cur2=mid+1,i=0;
        while(cur1<=mid&&cur2<=right)
        {
            if( nums[cur1]<=nums[cur2])tmp[i++]=nums[cur1++];
            else tmp[i++]=nums[cur2++];
        }

        while(cur1<=mid)//其中可能有一个数组更长
        {
                tmp[i++]=nums[cur1++];
        }
        while(cur2<=right)
        {
                tmp[i++]=nums[cur2++];
        }

        //还原到nums中
        for(int i=left;i<=right;i++)
        {
            nums[i]=tmp[i-left];
        }
    }
};
相关推荐
黄敬峰2 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术3 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六6 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术7 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize8 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考21 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营1 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode