首页 > 其他分享 >排序模板

排序模板

时间:2023-01-02 13:22:14浏览次数:63  
标签:nums int 复杂度 len large vector 排序 模板

目录

目的在于复习常见的排序题型和实现方式。

快速排序

时间复杂度:最坏情况为\(O\left(n^{2}\right)\);平均时间复杂度为\(O\left(n \log _{2} n\right)\);
空间复杂度为:最坏情况\(O(n)\),当退化为冒泡排序;最好情况为\(O(\log_2{n})\),递归调用需要保存一些数据;

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        quicksort(nums,0,nums.size()-1);
        return nums;
    }

    void quicksort(vector<int>& nums,int l,int r){
        if(l>=r) return;
        int i = l-1,j=r+1,x=nums[(l+r)>> 1];
        while(i<j)
        {
            while(nums[++i] < x);
            while(nums[--j]> x);
            if(i<j) {
                int t = nums[i];
                nums[i] = nums[j];
                nums[j] = t;
            }
        }
        quicksort(nums,l,j);
        quicksort(nums,j+1,r);
    }
};


堆排序

时间复杂度:buildMaxHeap为\(O(n)\);maxHeapify为\(O(\log_2{n})\);算法平均和最坏时间复杂度均为\(O(n\log_2{n})\);
空间复杂度为:\(O(1)\)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        heapSort(nums);
        return nums;
    }

    void heapSort(vector<int> &nums){
        int len = (int)nums.size() -1;
        buildMaxHeap(nums,len);
        for(int i=len;i>=1;--i){
            swap(nums[i],nums[0]);
            len -=1;
            maxHeapify(nums,0,len);
        }
    }

    //创建最大堆
    void buildMaxHeap(vector<int> & nums,int len){
        //i从最后一个父节点开始调整
        for(int i=len/2;i>=0;--i){
            maxHeapify(nums,i,len);
        }
    }

    //最大堆调整,将堆的末端子节点作调整,使得子节点永远小于父节点
    void maxHeapify(vector<int> & nums,int i,int len){
        for(;(i<<1) + 1 <= len;){
            int lson  = (i<<1) + 1;
            int rson = (i<<1) + 2;
            int large;
            if(lson <= len && nums[lson] > nums[i]){
                large = lson;
            } else {
                large = i;
            }

            if(rson <= len && nums[rson] > nums[large]){
                large = rson;
            }
            
            if(large != i){
                swap(nums[i],nums[large]);
                i = large;
            } else {
                break;
            }
        }
    }

    void swap(int &i,int &j){
        int t  = i;
        i = j;
        j = t;
    }
};

参考链接:
快速排序部分
[1] 快速排序时间复杂度分析 - ciwei的文章 - 知乎
[2] 快速排序模板 - 程序员阿sir的文章 - 知乎

标签:nums,int,复杂度,len,large,vector,排序,模板
From: https://www.cnblogs.com/AccompanyingLight/p/17013644.html

相关文章

  • 前端大屏模板分享-可在线浏览
    1.前言站长以前介绍过这个开源项目,最近又有人在问,索性挂在Dotnet9网站上,方便大家在线浏览,先声明,模板来自下面的仓库:仓库名:大屏数据展示模板作者:lvyeyou开源协议:MIT仓库地址......
  • C#.NET 随机排序集合(列表\数组) | 打乱集合(列表\数组)
    直接上代码:///<summary>///重排列表(打乱列表)///</summary>///<paramname="arr"></param>publicstaticList<string>ConfusionArray(List<string>list){......
  • 01排序
    快速排序问题将序列q的l~r区间排序voidquick_sort(intq[],intl,intr)基本思想——分治找一个参考值x通过双指针算法交换使得左半边全部是<=x,......
  • layui 注册模板--并且提示注册成功--太爽了
    <!doctypehtml><htmlclass="x-admin-sm"><head><metacharset="UTF-8"><title>后台登录-X-admin2.2</title><metaname="renderer"content="webkit|ie-comp......
  • Grafana模板
    Grafana模板ApacheJMeterDashboardusingCoreInfluxdbBackendListenerClientGrafana模板模板地址:https://grafana.com/grafana/dashboards?search=jmeterApacheJMete......
  • zabbix利用自带模板监控mysql常见问题
    先放出完整步骤:1,创建数据库监控用户mysql-uroot-prootGRANTUSAGEON*.*TO'mysqlcheck'@'localhost'IDENTIFIEDBY'mysqlcheck';FLUSHPRIVILEGES;注意:当出现错误:E......
  • Django模板层
    目录Django模板层一、关于模板语法二、模板层之标签二、自定义过滤器、标签三、模板的继承与导入四、模板层前期准备Django模板层一、关于模板语法针对需要加括号调用的......
  • C语言基于二叉排序树的学生成绩管理系统
    C语言基于二叉排序树的学生成绩管理系统1、基于二叉排序树的学生成绩管理系统1.1题目简述本次课题要求基于二叉排序树设计和实现一个简易的学生成绩管理系统,功能包含对......
  • 【排序】【数组】LeetCode 75. 颜色分类
    题目链接75.颜色分类思路题目要求按0、1、2的顺序排序,因为数量有限,所以通过两次遍历,分别将0和1交换到合适的位置,这样两次遍历之后,剩下的2就都在尾部了。代码classSol......
  • day 50 -vue模板语法
    vue模板语法插值语法 功能:用于解析标签体内容 写法:{{xxx}},xxx是js表达式,可以直接读取到data的所有属性指令语法 功能:用于解析标签(包括:标签属性,标签体内容,绑定事件.......