【剑斩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)) ];
    }
};
相关推荐
aaaameliaaa6 分钟前
计算斐波那契数(递归、迭代)(1,1,2,3,5.....)
c语言·开发语言·笔记·算法·排序算法
Jerry12 分钟前
LeetCode 977. 有序数组的平方
算法
Turbo正则37 分钟前
群论学习入门 | 群论与李群的基本概念
人工智能·学习·算法·抽象代数
sugar__salt1 小时前
手撕字符串算法:反转、回文、验证回文 Ⅱ 完整拆解
javascript·算法·面试·职场和发展
To_OC1 小时前
从一行报错开始,把字符串反转、回文算法连带着包装类一起捋明白
javascript·算法·api
LCG米1 小时前
机器人控制系统与运动规划:从RRT算法到ROS move_base实战
算法·机器人
QiLinkOS1 小时前
第三视觉理解徐玉生与他的商业活动(26)
大数据·c++·人工智能·算法·开源协议
手写码匠1 小时前
手写 LLM 结构化输出引擎 —— 从 JSON Schema 约束到类型安全的数据提取
人工智能·深度学习·算法·aigc
zhiSiBuYu05171 小时前
重排序(Rerank)提升检索准确率实战指南
开发语言·python·算法
月疯2 小时前
华为手环的部分功能
算法