【剑斩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)) ];
    }
};
相关推荐
kvo7f2JTy2 分钟前
基于机器学习算法的web入侵检测系统设计与实现
前端·算法·机器学习
List<String> error_P33 分钟前
蓝桥杯最后几天冲刺:暴力大法(一)
算法·职场和发展·蓝桥杯
流云鹤2 小时前
Codeforces Round 1090 (Div. 4)
c++·算法
wljy12 小时前
第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯·stl
清空mega3 小时前
C++中关于数学的一些语法回忆(2)
开发语言·c++·算法
香蕉鼠片3 小时前
数据结构八股(一)
数据结构·算法
Mr_Xuhhh3 小时前
从理论到实践:深入理解算法的时间与空间复杂度
java·开发语言·算法
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 42. 接雨水 | C++ 动态规划与双指针题解
c++·算法·leetcode
地平线开发者3 小时前
智能驾驶感知算法的演进
算法·自动驾驶
爱丽_4 小时前
B+ 树范围查询为什么快:页分裂/合并、索引设计与 SQL 写法优化
数据库·算法·哈希算法