【剑斩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)) ];
    }
};
相关推荐
Lips6111 小时前
2026.1.20力扣刷题笔记
笔记·算法·leetcode
2501_941329721 小时前
YOLOv8-LADH马匹检测识别算法详解与实现
算法·yolo·目标跟踪
洛生&1 小时前
Planets Queries II(倍增,基环内向森林)
算法
小郭团队2 小时前
1_6_五段式SVPWM (传统算法反正切+DPWM2)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·matlab·dsp开发
小郭团队2 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
鱼跃鹰飞2 小时前
Leetcode347:前K个高频元素
数据结构·算法·leetcode·面试
bybitq2 小时前
LeetCode236-二叉树的最近公共祖先(LCA)问题详解-C++
算法·深度优先
啊阿狸不会拉杆2 小时前
《数字图像处理》第 7 章 - 小波与多分辨率处理
图像处理·人工智能·算法·计算机视觉·数字图像处理
程序猿炎义3 小时前
【Easy-VectorDB】Faiss数据结构与索引类型
数据结构·算法·faiss
天赐学c语言4 小时前
1.20 - x的平方根 && vector的扩容机制以及删除元素是否会释放内存
c++·算法·leecode