leetcode(977)有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

面对这样的题目,先把原来的数据平方后,有几种算来进行排序

1.直接插入排序:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {//直接插入排序int i, j;//平方后的数组for (i = 0; i < nums.size(); i++){nums[i] = nums[i] * nums[i];}int temp = nums[0];for (i = 1; i < nums.size(); i++){if (nums[i] < nums[i - 1])//小的做为哨兵{temp = nums[i];//复制为哨兵for (j = i - 1; j >= 0 && nums[j] > temp ;  j--){nums[j + 1] = nums[j];}nums[j+1] = temp;}}return nums;}
};

在这里插入图片描述
结果同样的不尽如人意。

此算法的时间复杂度为O(n^2)

2.折半插入排序

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {//直接插入排序int i, j,low,high,mid;//平方后的数组for (i = 0; i < nums.size(); i++){nums[i] = nums[i] * nums[i];}int temp = nums[0];for (i = 1; i < nums.size(); i++){low=0;high=i-1;mid=(low+high)/2;if (nums[i] < nums[i - 1])//判断是否比前一个小,如果小就插入{temp = nums[i];//复制为哨兵,进行判断while(low<=high){if(temp>=nums[mid]){low=mid+1;}else{high=mid-1;}mid = (low + high) / 2;}for (j = i - 1; j>high ;  j--){nums[j + 1] = nums[j];}nums[high+1] = temp;}}return nums;}
};

折半插入排序插入排序也确实会比直接插入快了点。折半插入排序只是减少了比较次数,时间复杂度还是O(n^2)
在这里插入图片描述

3.希尔排序时间复杂度约为O(n^1.3), 最坏情况下时O(n^2)

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int step,i,j,temp;//平方后的数组for (i = 0; i < nums.size(); i++){nums[i] = nums[i] * nums[i];}//希尔排序for(step=nums.size()/2;step>0;step/=2)//步长变化{for(i=step;i<nums.size();i++){temp=nums[i];for(j=i-step;j>=0 && temp<nums[j];j-=step){nums[j+step]=nums[j];//后移}nums[j+step]=temp;}}return nums;}
};

在这里插入图片描述

结果有了显著的提升

采用空间换时间双指针的方法,优点类似与归并排序

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int pos,i,j;vector<int> temp(nums.size());for(i=0,j=nums.size()-1,pos=nums.size()-1;i<=j;){if(nums[i]*nums[i]>nums[j]*nums[j]){temp[pos--]=nums[i]*nums[i];i++;}else{temp[pos--]=nums[j]*nums[j];j--;}}return temp;}
};

空间复制度为O(n)

在这里插入图片描述
效果显而易见

4.快速排序

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {for(int i=0;i<nums.size();i++){nums[i]=nums[i]*nums[i];}QuickSort(nums,0,nums.size()-1);return nums;}void QuickSort(vector<int>& nums,int low,int high){if(low<high){int pivotpos=Patition(nums,low,high);QuickSort(nums,low,pivotpos-1);QuickSort(nums,pivotpos+1,high);}}//快速排序int Patition(vector<int>& number,int low,int high){    int pivot=number[low];//枢纽while(low<high){   while(low<high && number[high]>=pivot) {high--;}number[low]=number[high];//置换while(low<high && number[low]<=pivot){low++;}number[high]=number[low];}number[low]=pivot;return low;}
};

在这里插入图片描述

5.归并排序

#include <iostream>
#include<vector>using namespace std;
//归并排序void Merge(vector<int>& nums,int low,int mid,int high)
{int* temp = (int*)malloc(nums.size());int count, i, j;for (count = low; count <=high; count++){temp[count] = nums[count];}for (i = low, j = mid + 1, count = i; i <= mid&&j <= high; count++){if (temp[i] <= temp[j]){nums[count] = temp[i++];}else{nums[count] = temp[j++];}}while (i <= mid){nums[count++] = temp[i++];}while (j <= high){nums[count++] = temp[j++];}}void MergeSort(vector<int>& nums, int low, int high)
{if (low < high){int	mid = (low + high) / 2;MergeSort(nums, low, mid);MergeSort(nums, mid + 1, high);Merge(nums, low, mid, high);}}int main()
{//nums = [-4, -1, 0, 3, 10]vector<int> nums = { 16,1,0,100,10 };MergeSort(nums, 0, 4);for (int i = 0; i < 5; i++){printf(" % d\t", nums[i]);}}

leetcode中超时了,但是自己测试了一下没啥问题

6.堆排序

void HeadAdjust(vector<int>& nums, int k, int len)
{int i, j;nums[0] = nums[k];for (i = 2 * k; i <= len; i*=2){if (i < len-1 && nums[i] < nums[i + 1]){i++;}if (nums[0] >= nums[i]){break;}else{nums[k] = nums[i];k = i;}}nums[k] = nums[0];
}
//大根堆
void BuildMaxHeap(vector<int>& nums,int len)
{int i = 0;for ( i= len / 2; i > 0; i--){HeadAdjust(nums, i, len);}
}void HeapSort(vector<int>& nums, int len)
{int i,temp=0;BuildMaxHeap(nums, len);//初始化大根堆for ( i= len-1; i > 1; i--){temp = nums[i];nums[i] = nums[1];nums[1] = temp;HeadAdjust(nums, 1, i - 1);}}int main()
{//nums = [-4, -1, 0, 3, 10]vector<int> nums = { 0,53,17,78,9,45,65,87,32 };HeapSort(nums,nums.size());//MergeSort(nums, 0, 7);for (int i = 1; i < 9; i++){printf(" %d\t", nums[i]);}}

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

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

相关文章

IO多路复用之select全面总结(必看篇)

转载&#xff1a;http://www.jb51.net/article/101057.htm 1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取&#xff0c;它就通知该进程。IO多路复用适用如下场合&#xff1a; &#xff08;1&#xff09;当客户处理多个描述字时&#xff08;一般…

leetcode(283)移动零

283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作&#xff0c;不能拷贝额外的数组。 尽量减少操作次数。 方法一&#xff1…

exec函数族实例解析

转载&#xff1a;http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本&#xff0c;它将获得父进程数据空间、堆、栈等资源的副本。注意&#xff0c;子进程持有的是上述…

c/c++错题总结

1.类名 对象名 默认调用“对象名()”这个构造函数&#xff0c;在栈内存中存在对象名&#xff0c;在堆内存中存在实际对象&#xff1b; 2.类名 对象名(一个或以上个参数) 默认调用相应的构造函数&#xff0c;在栈内存中存在对象名&#xff0c;在堆内存中也是存在实际对象的&a…

c++程序编译过程

c程序编译分成四个过程&#xff1a;编译预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接 编译预处理&#xff1a;处理以#为开头 编译&#xff1a;将.cpp文件翻译成.s汇编文件 汇编&#xff1a;将.s汇编文件翻译成机器指令.o文件 链接&#xff1a;汇编生产的目标文件.o…

C++ template —— 动多态与静多态(六)

转载&#xff1a;http://www.cnblogs.com/yyxt/p/5157517.html 前面的几篇博文介绍了模板的基础知识&#xff0c;并且也深入的讲解了模板的特性。接下来的博文中&#xff0c;将会针对模板与设计进行相关的介绍。 ------------------------------------------------------------…

计算机的网络体系以及参考模型

计算机的网络体系以及参考模型一、OSI七层模型二、TCP/IP参考模型三、TCP/IP 五层参考模型四、OSI 模型和 TCP/IP 模型异同比较五、OSI 和 TCP/IP 协议之间的对应关系六、为什么 TCP/IP 去除了表示层和会话层&#xff1f;七、数据如何在各层之间传输&#xff08;数据的封装过程…

C++ 模板详解(二)

转载&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/25/2736224.html 四、类模板的默认模板类型形参 1、可以为类模板的类型形参提供默认值&#xff0c;但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值。 2、类模板的类…

C++ 模板详解(一)

转载&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C模板 模板是C支持参数化多态的工具&#xff0c;使用模板可以使用户为类或者函数声明一种一般模式&#xff0c;使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类…

剑指Offer09. 用两个栈实现队列

class CQueue { public:stack<int> stack1,stack2;CQueue() {//初始化栈while(!stack1.empty()){stack1.pop();}while(!stack2.empty()){stack2.pop();}}void appendTail(int value) {stack1.push(value);}int deleteHead() {if(stack2.empty()){while(!stack1.empty()){…

rk3588 之启动

目录 uboot版本配置修改编译 linux版本配置修改编译 启动sd卡启动制作spi 烧录 参考 uboot 版本 v2024.01-rc2 https://github.com/u-boot/u-boot https://github.com/rockchip-linux/rkbin 配置修改 使用这两个配置即可&#xff1a; orangepi-5-plus-rk3588_defconfig r…

C++引用详解

转载&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/20/2732687.html 引用的概念 引用&#xff1a;就是某一变量&#xff08;目标&#xff09;的一个别名&#xff0c;对引用的操作与对变量直接操作完全一样。 引用的声明方法&#xff1a;类型标识符 &引用名目标…

Linux网络编程服务器模型选择之循环服务器

转载&#xff1a;http://www.cnblogs.com/lizhenghn/p/3617608.html 在网络程序里面&#xff0c;通常都是一个服务器处理多个客户机&#xff0c;为了出个多个客户机的请求&#xff0c;服务器端的程序有不同的处理方式。本节开始介绍Linux下套接字编程的服务器模型选择&#xff…

剑指Offer04. 二维数组中的查找

在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该整数。 相当于二叉搜索树,左孩子比根节点小&…

Linux网络编程服务器模型选择之并发服务器(上)

转载&#xff1a;http://www.cnblogs.com/lizhenghn/p/3617666.html 与循环服务器的串行处理不同&#xff0c;并发服务器对服务请求并发处理。循环服务器只能够一个一个的处理客户端的请求&#xff0c;显然效率很低。并发服务器通过建立多个子进程来实现对请求的并发处理。并发…

Linux网络编程服务器模型选择之并发服务器(下)

转载&#xff1a;http://www.cnblogs.com/lizhenghn/p/3618986.html 前面两篇文章&#xff08;参见&#xff09;分别介绍了循环服务器和简单的并发服务器网络模型&#xff0c;我们已经知道循环服务器模型效率较低&#xff0c;同一时刻只能为一个客户端提供服务&#xff0c;而且…

Linux网络编程服务器模型选择之IO复用循环并发服务器

转载&#xff1a;http://www.cnblogs.com/lizhenghn/p/3619091.html 在前面我们介绍了循环服务器&#xff0c;并发服务器模型。简单的循环服务器每次只能处理一个请求&#xff0c;即处理的请求是串行的&#xff0c;效率过低&#xff1b;并发服务器可以通过创建多个进程或者是线…

memcpy/memset函数的c语言实现

转载&#xff1a;http://blog.csdn.net/u011118276/article/details/46742341 1、memcpy 头文件&#xff1a;#include <string.h> 函数原型&#xff1a;void *memcpy(void *dest, const void *src, size_t n) 功能&#xff1a;将指针src指向的内存空间的n个字节复制到des…

计算机网络(一)计算机网络体系

计算机网络&#xff08;一&#xff09;计算机网络体系一、计算机网络概述概念功能组成分类二、体系结构和参考模型ISO/OSI模型物理层网络层传输层会话层表示层应用层OSI参考模型与TCP/IP参考模型OSI参考模型与TCP/IP参考模型不同5层参考模型一、计算机网络概述 概念 计算机网…

计算机网络(二)物理层

计算机网络&#xff08;二&#xff09;物理层一、通信基础物理层接口特性1.机械特性2.电气特性3.功能特性4.规程特性典型的数据通信模型三种通信方式1.单工通信2.半双工通信/双向交替通信3.全双工通信/双向同时通信数据传输方式串行传输并行传输同步传输异步传输二、数据交换方…