Leetcode912.排序数组(三路划分)

news2024/9/24 19:22:35

文章目录

  • 一、三路划分
  • 二、Leetcode912.排序数组


一、三路划分

为何还会有三路划分?

快速排序算法在某个数据大量重复时效率极低,在运行程序时会超出时间限制,为了解决数据大量重复的情况下,三路划分诞生了。三路划分是基于快速排序思想上的,三路划分在于解决数据中有大量重复或者几乎为同一个数据时想出来的,但是对于一般的数据也可以排序。

三路划分思想

三路划分是基于快速排序思想,选出数据中的关键字(随机选数选出关键字),然后对这个关键字(key)进行单趟排序,使小于key的值甩到key的左边,将大于key的值甩到右边,而中间很大一部分区间的值是相同的。中间相等的区间就不用再处理,对这个关键字它的左区间进行相同处理,右区间进行相同处理,对相等值区间不再处理。
在这里插入图片描述

三指针实现,left,cur,right选出关键字如果随机选取之后左边做关键字key=a[left]则从左边走,此时cur = left+1,如果随机选取之后右边做关键字key = a[right],则cur = right-1,从右边开始走。cur对应得值与关键字key比较,·当a[cur] == key,cur++;当a[cur] < key,就将a[cur]与a[left],此时cur++,left++,当a[cur] > key,将a[right]与a[cur]交换,此时right--,cur不动,由于并不知道交换过来的值是大于还是小于或者等于关键字key,直到cur走到超过right为止。这样一趟排下来会得到区间right - left中的值是相同,区间[begin,left]值小于key,区间[right+1,end]值大于key,这时也就划分为了三个区间(小于、等于、大于)。这样的方法也很类似快排的前后指针法。
在这里插入图片描述
一趟排之后划分出三个区间
在这里插入图片描述

二、Leetcode912.排序数组

在这里插入图片描述
在这里插入图片描述

返回的数组必须是自己malloc出来的

在这里插入图片描述

返回数组首元素地址

在这里插入图片描述

返回的这个数组有多大

用快排三路划分将数组排序

void Swap(int* e1, int* e2)
{
	int tmp = *e1;
	*e1 = *e2;
	*e2 = tmp;
}

void QuickSort(int*a,int left,int right)
{
	//当区间大小为1或者不存在就不需要单趟排序了
    if(left>=right)
    {
        return ;
    }
	//随机选数
    int randi = left + (rand() % (right - left));
	if (randi != left)
	{
		Swap(&a[randi], &a[left]);//以左边做关键值
	}

    int begin = left;
    int key = a[left];//以左边做关键值
    int end = right;
    int cur = left+1;//类似前后指针法

    while(cur<=right)
    {
        if(a[cur] < key)//当前值小于key,交换,两者都向后移动
        {
            Swap(&a[cur], &a[left]);
            cur++;
            left++;
        }

        else if(a[cur]>key)//大于时与最右边的交换,然后right--,
        //由于最开始并不确定a[left]与key关系,所以交换后cur不动
        {
            Swap(&a[cur], &a[right]);
            right--;
        }

        else
        {
            cur++;
        }
    }
    //类似普通快排递归排key值对应区间它的左区间
    QuickSort(a,begin,left-1);
    //递归排key值对应区间它的右区间
    QuickSort(a,right+1,end);
	
	//关键字对应区间不需要处理
}

int* sortArray(int* nums, int numsSize, int* returnSize){
  int*a = (int*)malloc(sizeof(int)*numsSize);
  *returnSize = 0;
   QuickSort(nums,0,numsSize-1);
   //将排好序的数组依次赋值给malloc出来的数组
   for(int i = 0; i<numsSize;i++)
   {
       a[(*returnSize)++] = nums[i];
   }
   
   return a;//返回malloc出来的数组a的首地址
}

三路划分用于解决对大量重复的数据进行排序的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五回:如何使用ListView Widget

文章目录概念介绍使用方法示例代码我们在上一章回中介绍了Container Widget,本章回中将介绍 ListView这种Widget&#xff0c;闲话休提&#xff0c;让我们一起Talk Flutter吧。概念介绍 ListView就是一个滚动的列表&#xff0c;它可以看作是在Column的基础上添加了滚动功能&…

WPS表格查找替换技巧:让你的工作效率翻倍

WPS表格中查找和替换是最基础的操作&#xff0c;看似简单&#xff0c;但是还有很多人在工作中不会熟练使用&#xff0c;其实掌握一些小技巧可以快速提高工作效率&#xff0c;本节课就来介绍几种比较有效的“查找和替换技巧”。 本节课目录&#xff1a; 1、常规的查找和替换 2…

AIGC市场群雄逐鹿,阿里云发出了什么大招?

如果要评选当下IT圈最火爆的话题&#xff0c;相信就算生成式AI&#xff08;Artificial Intelligence Generated Content&#xff0c;简称AIGC&#xff09;甘认第二&#xff0c;也没有人敢认第一。于是我们看到&#xff0c;在ChatGPT快速升级迭代的同时&#xff0c;百度、360、商…

基于树莓派的智能家居控制系统设计论文参考

完整论文咨询可WX联系&#xff1a;gyf1842965496 智能家居控制系统功能实现详细介绍&#xff1a;基于树莓派的智能家居控制系统设计https://blog.csdn.net/G1842965496/article/details/125491350#comments_26030679 目录 论文简述 摘要 随着科技的进步&#xff0c;人们生活水…

DAY 37 shell免交互

Here Document 概述 常用的交互程序&#xff1a;read&#xff0c;ftp&#xff0c;passwd&#xff0c;su&#xff0c;sudo cat也可配合免交互的方式重定向输出到文件 Here Document 的作用 使用I/O重定向的方式将命令列表提供给交互式程序标准输入的一种替代品 格式 命令 &…

创建部署你的第一个智能合约

原文参考地址 【Web3 开发系列教程—创建你的第一个智能合约&#xff08;2&#xff09;】部署第一个智能合约&#xff0c;增加自己的内容 如果你是区块链开发的新手并且不知道从哪里开始&#xff0c;或者你只是想了解如何部署智能合约并与之交互&#xff0c;那么本指南适合你。…

大数据技术(入门篇)--- 使用Spring Boot 操作 CDH6.2.0 Spark SQL进行离线计算

前言 CDH 6.2.0 搭建的环境&#xff0c;并不能直接使用 spark 相关资源&#xff0c;需要对此服务端环境进行一些修改Spark 目前仅支持 JDK1.8, Java项目运行环境只能使用JDK 1.8我这里使用的是 CDH6.2.0集群&#xff0c;因此使用的依赖为CDH专用依赖&#xff0c;需要先添加仓库…

跨平台开发工具怎么选?IDE工具推荐

软件开发工具链的价值&#xff0c;越来越多企业看到了它。近年来&#xff0c;国内也迎来了软件开发工具的自主化浪潮&#xff0c;今天就来跟大家盘点一下2023年十大移动开发IDE工具。 一、Android Studio 作为Android开发IDE工具的首选&#xff0c;Android Studio提供了一个全…

API7 助力头部券商实现数字化转型

背景 随着中国经济步入高质量发展阶段&#xff0c;数字化转型正在被更多的企业提上议程。2021 年证监会出台的《证券期货行业科技发展“十四五”规划》中指出&#xff0c;需“提升证券期货业数据治理水平”&#xff0c;“深化数字化转型标准建设&#xff0c;推动行业数据接口的…

涨点神器:Yolov8引入CVPR2023 InternImage:注入新机制,扩展DCNv3,助力涨点,COCO新纪录65.4mAP!

1.InternImage介绍 论文:https://arxiv.org/abs/2211.05778 代码:GitHub - OpenGVLab/InternImage: [CVPR 2023 Highlight] InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions 理论部分参考知乎:CVPR2023 Highlight | 书生模型霸…

机器学习:LightGBM算法原理(附案例实战)

机器学习&#xff1a;LightGBM算法原理&#xff08;附案例实战&#xff09; 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可…

Python结合Qt实现点击按钮保存并生成自定义word详细讲解(相信我,耐心看完,一定会有收获的)

一、需求介绍 因为我的毕设需要设计一个系统&#xff0c;然后把结果生成检测报告供企业下载。模型大概已经训练好了&#xff0c;也就差个导出word功能&#xff0c;把模型识别的数据结果输入到word导出即可。 二、最终实现效果 这里随便整个模板来对所需要的函数进行说明&…

嵌入式 QT Creator使用

目录 1、QT Creator界面 2、QT Creator设置 3、第一个程序 3.1 新建一个项目 3.2 项目的文件组成和管理 3.3 项目的编译、调试与运行 1、QT Creator界面 启动 Qt Creator &#xff0c;出现如图 1 所示的主窗口&#xff1a; Qt Creator 的界面很简洁。上方是主菜单栏&a…

【架构设计】如何设计一个几十万在线用户弹幕系统

文章目录 一、前言二、项目介绍客户端轮询WebSocket主动推送 三、弹幕初始架构四、弹幕架构演进五、弹幕存储六、弹幕查询七、总结 一、前言 现在无论是直播还是电视剧&#xff0c;我们都可以看到上面慢慢的弹幕&#xff0c;满足十几万用户在线的弹幕系统&#xff0c;我们该如…

ChatGPT 如何获取API Key

什么是OpenAI API Key? OpenAI是ChatGPT的“开发商”&#xff0c;提供API使得开发者可以在自己的应用程序上调用OpenAI的相关服务&#xff08;除了ChatGPT&#xff0c;OpenAI还有其他产品&#xff09;。如果想调用OpenAI的产品服务在自己的应用程序上&#xff0c;我们就需要申…

Web接口测试工具---Poster与Postman

工作当中有不少时间在编写和维护接口自动化测试用例。打算先整理一些接口相关工具的使用。 简单对接Web口测试的相关工具/技术做个划分。 HTTP/SOAP协议接口的功能测试&#xff1a; 1、浏览器URL&#xff08;GET请求&#xff09; http://127.0.0.1:8000/login/?usernamezhangs…

4.25、IO多路复用简介

4.25、IO多路复用简介 1. I/O多路复用&#xff08;I/O多路转接&#xff09;①阻塞等待&#xff08;BIO模型&#xff09;②非阻塞&#xff0c;忙轮询&#xff08;NIO模型&#xff09;③IO多路转接技术&#xff08;select/poll&#xff09;④IO多路转接技术&#xff08;epoll&am…

基于DeepSpeed训练ChatGPT

基于DeepSpeed训练ChatGPT 最少只需一张32G GPU&#xff0c;自己也可以训练一个ChatGPT&#xff01; 最近微软发布了一个基于DeepSpeed的训练优化框架来完成ChatGPT类模型的训练&#xff0c;博主对其进行了研究并通过此博文分享相关技术细节。 一、配置预览 1、开源仓库&…

如何更换电脑背景图片?这样做很简单!

案例&#xff1a;怎样把电脑背景图换成自己的照片&#xff1f; 【我的电脑背景图片是系统自带的壁纸&#xff0c;不太好看&#xff0c;我想把它换成自己的照片。有没有小伙伴知道电脑怎么更换背景图片&#xff1f;在线求个简单的方法&#xff01;】 在日常生活中&#xff0c;…

YOLOV5引入SE注意力机制以及精度提升问题

YOLOV5引入SE注意力机制以及精度提升问题 1. 如何增加SE注意力机制 在model/common.py中添加SE结构 class SE(nn.Module):def __init__(self, c1, c2, r16):super(SE, self).__init__()self.avgpool nn.AdaptiveAvgPool2d(1)self.l1 nn.Linear(c1, c1 // r, biasFalse)sel…