【剑斩OFFER】算法的暴力美学——排序数组

一、题目描述

二、算法原理

根据题目要求我们要把一个数组变成一个升序的数组,而且时间复杂度为:O(n log( n )) ,这里我们使用快排来解决这道题,不懂快排的可以看这篇博客:

https://blog.csdn.net/2403_84958571/article/details/147355114?fromshare=blogdetail&sharetype=blogdetail&sharerId=147355114&sharerefer=PC&sharesource=2403_84958571&sharefrom=from_linkhttps://blog.csdn.net/2403_84958571/article/details/147355114?fromshare=blogdetail&sharetype=blogdetail&sharerId=147355114&sharerefer=PC&sharesource=2403_84958571&sharefrom=from_link

不过我们要把快排进行一下修改,基准值的我们使用随机值:rand () ,根据算法导论可得:这个随机的标准值可以接近于:O(n logn )

而且我们不使用原来快排的比较数值大小的方式,我们使用分治的思想:

https://blog.csdn.net/2403_84958571/article/details/155648142?fromshare=blogdetail&sharetype=blogdetail&sharerId=155648142&sharerefer=PC&sharesource=2403_84958571&sharefrom=from_linkhttps://blog.csdn.net/2403_84958571/article/details/155648142?fromshare=blogdetail&sharetype=blogdetail&sharerId=155648142&sharerefer=PC&sharesource=2403_84958571&sharefrom=from_link

假设我们随机选择的基准值为1,那么一轮查找之后,数组里面所有的1都会呆在该待的数组的位置:

此时,我们就在绿色数组里面,再随机找一个随机值来作为基准值,再固定这个基准值的在数组的位置,最后不断的划分,直到这个数组变成有序。

三、代码实现

cpp 复制代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        srand(time(NULL));
        int n = nums.size();
        Quicksort(0,n - 1,nums);
        return nums;
    }
    
    void Quicksort(int l,int r,vector<int>& nums)
    {
        if(l >= r) return;
        int keyi = Get(l,r,nums);
        int i = l;
        int left = l - 1;
        int right = r + 1;

        while(i < right)
        {
            if(nums[i] > keyi) swap(nums[i],nums[--right]);
            else if(nums[i] == keyi) i++;
            else swap(nums[++left],nums[i++]);
        }

        Quicksort(l,left,nums);//zuobian
        Quicksort(right,r,nums);//右边
    }

    int Get(int l,int r,vector<int>& nums)
    {
        int tmp = rand();
        return nums[ l + (tmp % (r - l + 1)) ];
    }
};
相关推荐
iAkuya1 分钟前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展
梵刹古音4 分钟前
【C语言】 指针与数据结构操作
c语言·数据结构·算法
VT.馒头9 分钟前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
CoderCodingNo2 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
大闲在人2 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
小熳芋2 小时前
443. 压缩字符串-python-双指针
算法
2501_924878732 小时前
数据智能驱动进化:AdAgent 多触点归因与自我学习机制详解
人工智能·逻辑回归·动态规划
Charlie_lll2 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper2 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771552 小时前
C++中的组合模式
开发语言·c++·算法