LeetCode排序数组(常用排序一一实现)

news2024/11/22 17:07:45

912. 排序数组 - 力扣(LeetCode)

这道题他会设置一个数据量特别特别大的案例,对于一般的算法是一定过不去的

1.冒泡排序---这种的时间复杂度是O(n*n),对于这道题是不可能过得去的

在这里插入图片描述

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArray(int* nums, int numsSize, int* returnSize)
{
    //冒泡
    for(int i=0;i<numsSize;i++)
    {
        for(int j=0;j<numsSize-i-1;j++)
        {
            //小到大
            if(nums[j]>nums[j+1])
            {
                int tem=nums[j];
                nums[j]=nums[j+1];
                nums[j+1]=tem;
            }
        }
    }
    *returnSize=numsSize;
    return nums;

}

2.选择排序---时间复杂的是O(n*n),也是不能过得去的

在这里插入图片描述

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArray(int* nums, int numsSize, int* returnSize)
{
    //选择排序,遍历数组找到最小的数位置记录下来,然后与第i位进行交换
    *returnSize=numsSize;
    for(int i=0;i<numsSize;i++)
    {
        int n=i;//记录最小的元素的下角标
        for(int j=i+1;j<numsSize;j++)
        {
            if(nums[j]<nums[n])
            {
                n=j;
            }
        }
        //将第n位与第i为进行交换
        int tem=nums[n];
        nums[n]=nums[i];
        nums[i]=tem;
    }
    return nums;
}

 3.插入排序---时间复杂度O(n*n),也是不能过的去的

在这里插入图片描述

int* sortArray(int* nums, int numsSize, int* returnSize)
{
    //插入排序:在已经排好序的数组中进行插入
    *returnSize=numsSize;
    for(int i=0;i<numsSize;i++)
    {
        //从此位置向前比
        for(int j=i;j>0;j--)
        {
            if(nums[j]<nums[j-1])
            {
                int tem=nums[j];
                nums[j]=nums[j-1];
                nums[j-1]=tem;
            }
            else
            break;
        }
    }
    return nums;
}

4.希尔排序---插入排序的进阶,时间复杂度O(n^1.3),可以实现

在这里插入图片描述

int* sortArray(int* nums, int numsSize, int* returnSize)
{
    //希尔排序---插入排序的进阶,可以减少查找次数,移动次数减少
    *returnSize=numsSize;
    int i,j,inc,key;
    for(inc=numsSize/2;inc>0;inc/=2)
    //inc表示每次分组中元素的个数,直到为0的时候才停止
    {
        for(i=inc;i<numsSize;i++)//从inc位置开始,后面的每一个都要进行排序
        {
            //key=nums[i];//记录这个位置的值
            for(j=i;j>=inc&&nums[j]<nums[j-inc];j-=inc)//每次比较的时候都要用组与组之间进行对比,并且我们比较的值不能比第一组的值更靠前
            //而且我们是从尾向前开始比较的
            {
                //nums[j]=nums[j-inc];//每次向前走一组的位置
                key=nums[j];
                nums[j]=nums[j-inc];
                nums[j-inc]=key;
            }
            //nums[j]=key;
        }
    }
    return nums;
}

5.快排---时间复杂度O(nlogn)

快排第一次移动的必须是右边的角标,因为现在我们是以左边的为比较的对象,所以开始的时候必须是右边的角标先动

 void quicksort(int* nums,int left,int right)
 {
     if(left>=right)
     return;
     else
     {
         int mem_left=left;
         int mem_right=right;//分别记录左角标,右角标
         int com=nums[left];
         int flag=1;//0移动左角标,1移动右角标
         while(left<right)
         {
             if(flag==0)
             {
                 //左角标动
                 if(nums[left]<=com)
                 {
                     left++;
                 }
                 else
                 {
                    //换位
                    nums[right]=nums[left];
                    right--;
                    flag=1;
                 }
             }
             else
             {
                 //右角标动
                 if(nums[right]>=com)
                 {
                     right--;
                 }
                 else
                 {
                     //换位
                     nums[left]=nums[right];
                     left++;
                     flag=0;
                 }
             }
         }
         nums[left]=com;
         quicksort(nums,mem_left,left-1);
         quicksort(nums,left+1,mem_right);
     }
 }
 int* sortArray(int* nums, int numsSize, int* returnSize)
 {
     //快排
     *returnSize=numsSize;
     int left=0;
     int right=numsSize-1;
     quicksort(nums,left,right);
     return nums;
 }

我们的快排还是无法通过本题----因为我们每次排序选取的比较对象是首元素没有随机性,需要改进

 void quicksort(int* nums,int left,int right)
 {
     if(left>=right)
     return;
     else
     {
         int mem_left=left;
         int mem_right=right;//分别记录左角标,右角标
         int tem=rand()%(right-left+1)+left;
         //交换两个位置的值到最左边
         int com=nums[tem];
         nums[tem]=nums[left];
         nums[left]=com;
         int flag=1;//0移动左角标,1移动右角标
         while(left<right)
         {
             if(flag==0)
             {
                 //左角标动
                 if(nums[left]<=com)
                 {
                     left++;
                 }
                 else
                 {
                    //换位
                    nums[right]=nums[left];
                    right--;
                    flag=1;
                 }
             }
             else
             {
                 //右角标动
                 if(nums[right]>=com)
                 {
                     right--;
                 }
                 else
                 {
                     //换位
                     nums[left]=nums[right];
                     left++;
                     flag=0;
                 }
             }
         }
         nums[left]=com;
         quicksort(nums,mem_left,left-1);
         quicksort(nums,left+1,mem_right);
     }
 }
 int* sortArray(int* nums, int numsSize, int* returnSize)
 {
     //快排
     //生成随机种子
     srand((unsigned int)time(NULL));
     *returnSize=numsSize;
     int left=0;
     int right=numsSize-1;
     quicksort(nums,left,right);
     return nums;
 }

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

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

相关文章

EMQX将数据发送到后端

本文主要是记录了使用免费的EMQX的数据集成功能&#xff0c;将数据流转到后端平台。 在实现过程中&#xff0c;首先是在云服务器之中下载了EMQX&#xff0c;之后通过EMQX的数据集成功能&#xff0c;创建了数据桥接以及与之对应的规则&#xff0c;可以实现将EMQX接收到的数据转发…

C# | 二分查找算法的实现

C# | 二分查找算法的实现 文章目录 C# | 二分查找算法的实现前言示例代码算法思路测试结果结束语 前言 二分查找法一种在有序数组中查找目标值的算法。划重点——“有序”&#xff0c;与需要遍历整个数组的查询算法不同&#xff0c;二分查找法通过将数组分成两部分来快速定位目…

MATLAB-二维图形的绘制

本博文主要介绍绘图函数 Plot 函数的使用,图形的网格、坐标、标题、图例备注以及线型和颜色标记等。 一、Plot 指令 将数据绘制成曲线的函数是 Plot 指令, 该命令可以带有不同数目的参数。最简单的形式就是将数据传递给 Plot , 但是线条的类型和颜色和颜色…

Vue.js 比较重要知识点总结三

概述 Vue 中 nextTick 的实现原理v-if 和 v-show 的区别Vue 中的 key 有什么作用如何理解ref toRef和toRefsComposition API如何实现代码逻辑复用&#xff1f; Vue 中 nextTick 的实现原理 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xf…

chatgpt赋能python:Python在线聊天:实现即时通讯的快速解决方案

Python在线聊天&#xff1a;实现即时通讯的快速解决方案 在当今数字时代&#xff0c;在线聊天已经成为人与人之间交流的主流方式。Python在线聊天应用程序提供了一种快速且可定制的解决方案&#xff0c;使个人用户和企业可以进行互联网通信。本文将向您介绍Python在线聊天的基…

软考A计划-电子商务设计师-电子商务系统建设

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

深挖MYSQL大表加索引

深挖MYSQL大表加索引 起因是这样的&#xff0c;有一张表存在慢sql&#xff0c;查询耗时最多达到12s&#xff0c;定位问题后发现是由于全表扫描导致&#xff0c;需要对字段增加索引&#xff0c;但是表的数据量600多万有些大&#xff0c;网上很多都说对大表增加索引可能会导致锁…

垂直行业(新站)SEO流量快速起飞的核心思路

现在做站不比以前了&#xff0c;不管你是做百度也好&#xff0c;还是谷歌也罢&#xff0c;对于行业精准SEO流量来说肯定是没有以前那么容易做了。但是不容易做不代表没有机会做&#xff0c;机会一直还是有的&#xff0c;尤其是最近百度打击泛站&#xff0c;对于垂直行业来说其实…

chatgpt赋能python:Python图片尺寸大小修改指南

Python图片尺寸大小修改指南 在现代网站设计中&#xff0c;图像是非常重要的一部分。图片质量和大小是网站排名和用户体验的关键因素。一般来说&#xff0c;网站应该尽量避免使用过多的大图片&#xff0c;因为它们会使用户等待过长的时间&#xff0c;同时也会降低网站的加载速…

JAVA基础练习(6)

目录 1.冒泡排列学员成绩(降序) 2.常用Arrays类的应用 2.1.sort 2.2.equals 2.3.toString 2.4.fill 2.5.Arrays.copyOf 2.6.binarySearch 3.利用二维数组计算成绩 1.冒泡排列学员成绩(降序) package ch06;import java.util.Arrays; import java.util…

代码随想录算法训练营第四十一天|343. 整数拆分|96.不同的二叉搜索树

LeetCode343. 整数拆分 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 2&#xff0c;确定递推公式&#xff1a;可以想 dp[i]最大乘积…

下载安装微软office的详细步骤

目录 一、前言 二、下载路径 &#xff08;一&#xff09;wps office 办公软件下载地址 1.wps office办公软件下载地址 &#xff08;二&#xff09;微软office 办公软件下载地址--2021 1.专业增强版 2.专业版 3.家庭专业版 4.家庭企业版 &#xff08;三&#xff09;…

JAVA基础练习(1)

目录 1.练习一:使用变量存储数据&#xff0c;实现个人简历信息的输出 2.练习二:使用Scanner类获取键盘输入的会员卡号&#xff0c;并将该数据存储在变量中&#xff0c;输出这个变量的信息 3.练习三:键盘输入四位数字的会员卡号,使用“/”和“%”运算符分解获得会员卡各个位上…

(二)模拟实现 《资源发现》框架

文章目录 前言资源发现《资源发现》概述技术难点 《资源发现》基本思想《资源发现》框架思考需求分析技术选择 《资源发现》技术难点实现《资源发现》框架实现资源发现基础类实现资源注册中心的实现资源持有者和资源请求者资源持有者和资源请求者功能具体实现 前言 《资源发现…

JAVA基础练习(4)

目录 1.利用循环打印九九乘法表 2.使用循环输出 100、95、90、85.......5 3.输入星期查看对应结果 4.几行数字展示 5.打印1-100之间13的倍数&#xff0c;使用for循环 6.用*来打印&#xff0c;根据用户输入rows和columns&#xff0c;来打印响应矩形 7.输入三个班&#xff…

YOLO8自定义检测实战

文章目录 资料模型介绍(或者叫weights)安装安装ultralytics&#xff08;yolo&#xff09;Torch测试命令 CLI命令行通过COCO128数据集体验yolov8标签predictsegment下载COCO 2017数据集ValTrain 自定义数据集标注标注软件labelimg分析训练结果 获得最佳训练结果提示 资料 Docs:…

docker学习记录

1.什么是docker&#xff1f; Docker是一个容器引擎&#xff0c;使用 Linux 内核功能&#xff08;如命名空间和控制组&#xff09;在操作系统之上创建容器。除了作为一种容器技术之外&#xff0c;Docker 还具有定义明确的包装器组件&#xff0c;这使打包应用程序变得十分容易&am…

Windows认证机制

windows认证基础 windows的认证包括三个部分&#xff1a; 本地认证&#xff1a;用户直接操作计算机登录账户网络认证&#xff1a;远程连接到工作组中的某个设备域认证&#xff1a;登录到域环境中的某个设备 本地认证 1、用户输入密码 2、系统收到密码后将用户输入的密码计…

LeetCode 周赛 348(2023/06/05)数位 DP 模板学会了吗

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入知识星球提问&#xff01; 往期回顾&#xff1a;LeetCode 单周赛第 347 场 二维空间上的 LIS 最长递增子序列问题 周赛 348 概览 T1. 最小化字符串长度&#xff08;Medium&…

chatgpt赋能python:Python基础教程:如何利用Python进行地区查询

Python基础教程&#xff1a;如何利用Python进行地区查询 在现代社会&#xff0c;人们越来越关注自己所处的地理位置和周边环境。这就导致了地区查询变得越来越流行&#xff0c;因为它可以让人们更加方便地获取自己想要的信息。 Python作为一门强大的编程语言&#xff0c;不仅…