LeetCode 912. 排序数组(10种排序)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 插入排序
      • 2.2 冒泡排序
      • 2.3 选择排序
      • 2.4 希尔排序
      • 2.5 归并排序
      • 2.6 快速排序
      • 2.7 堆排序
      • 2.8 计数排序
      • 2.9 桶排序
      • 2.10 基数排序
    • 3. 复杂度表

1. 题目

给你一个整数数组 nums,将该数组升序排列。

示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]提示:
1 <= nums.length <= 50000
-50000 <= nums[i] <= 50000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

基础的排序算法,写一遍复习一下。
参考我的博客:
10种C++排序算法
快速排序quicksort算法优化
快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)

2.1 插入排序

class Solution {
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j;for(i = 0; i < arr.size(); ++i){for(j = i; j > 0; --j){if(arr[j-1] > arr[j])swap(arr[j-1],arr[j]);elsebreak;}}return arr;}
};

9 / 10 个通过测试用例,超时

2.2 冒泡排序

class Solution {
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j;bool arrSorted = false;for(i = 0; i < arr.size(); ++i){arrSorted = true;for(j = 1; j <= arr.size()-1-i; ++j){if(arr[j-1] > arr[j]){swap(arr[j-1],arr[j]);arrSorted = false;}}if(arrSorted)break;}return arr;}
};

超时

2.3 选择排序

class Solution {	//选择
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j, minIdx = 0;for(i = 0; i < arr.size()-1; ++i){minIdx = i;for(j = i+1; j < arr.size(); ++j){if(arr[minIdx] > arr[j])minIdx = j;}swap(arr[i],arr[minIdx]);}return arr;}
};

超时

2.4 希尔排序

class Solution {	//希尔
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j, gap = 1;for(gap = arr.size()/2; gap > 0; gap /= 2){for(i = gap; i < arr.size(); ++i){for(j = i; j-gap >= 0 && arr[j-gap]>arr[j]; j -= gap)swap(arr[j-gap],arr[j]);}}return arr;}
};

72 ms 15.8 MB

2.5 归并排序

class Solution {	//归并vector<int> temp;
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;temp.resize(arr.size());mergeSort(arr,0, arr.size()-1);return arr;}void mergeSort(vector<int>& arr, int l, int r){if(l == r)return;int mid = l+((r-l)>>1);mergeSort(arr,l,mid);mergeSort(arr,mid+1,r);merge(arr,l,mid,r);}void merge(vector<int>& arr, int l, int mid, int r){int i = l, j = mid+1, k = 0;while(i <= mid && j <= r){if(arr[i] <= arr[j])temp[k++] = arr[i++];elsetemp[k++] = arr[j++];}while(i <= mid)temp[k++] = arr[i++];while(j <= r)temp[k++] = arr[j++];for(k = 0, i = l; i <= r; ++i,++k)arr[i] = temp[k];}
};

52 ms 16 MB

2.6 快速排序

class Solution {	//快排
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;qsort(arr,0, arr.size()-1);return arr;}void qsort(vector<int>& arr, int l, int r){if(l >= r)return;int Pl = l, Pr = l;partition(arr,l,r,Pl,Pr);qsort(arr,l,Pl-1);qsort(arr,Pr+1,r);}void partition(vector<int>& arr, int l, int r, int& Pl, int& Pr){	selectMid(arr,l,r);int P = arr[l];int i = l, j = r;while(i < j){while(i < j && P < arr[j])//没有等于号,哨兵都在左侧j--;swap(arr[i], arr[j]);while(i < j && arr[i] <= P)i++;swap(arr[i], arr[j]);}Pl = Pr = i;for(i = i-1; i >= l; --i)//聚集左侧与哨兵相等的到中间{if(arr[i] == P){Pl--;swap(arr[i], arr[Pl]);}}}void selectMid(vector<int>& arr, int l, int r){int mid = l+((r-l)>>1);if(arr[mid] > arr[r])swap(arr[mid],arr[r]);if(arr[l] > arr[r])swap(arr[l], arr[r]);if(arr[mid] > arr[l])swap(arr[mid], arr[l]);}
};

52 ms 15.6 MB
96 ms 15.8 MB(删除聚集哨兵操作后的用时)

2.7 堆排序

class Solution {	//堆排序, 建堆(升序建大堆,降序建小堆)
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;for(int i = arr.size()/2-1; i >= 0; --i)adjust(arr,i,arr.size());//建堆for(int i = arr.size()-1; i >= 0; --i){swap(arr[i],arr[0]);adjust(arr,0,i);}return arr;}void adjust(vector<int>& arr, int i, int len){int lchild = 2*i+1, rchild = 2*i+2, maxIdx = i;while(lchild < len){if(lchild < len && arr[lchild] > arr[maxIdx])maxIdx = lchild;if(rchild < len && arr[rchild] > arr[maxIdx])maxIdx = rchild;if(maxIdx != i){swap(arr[i],arr[maxIdx]);lchild = 2*maxIdx+1;rchild = lchild+1;i = maxIdx;}elsebreak;}}
};

72 ms 15.8 MB

2.8 计数排序

class Solution {	//计数排序
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j = 0, min, max;min = max = arr[0];for(i = 1; i < arr.size(); ++i){min = arr[i] < min ? arr[i] : min;max = arr[i] > max ? arr[i] : max;}const int N = max-min+1;vector<int> count(N,0);for(i = 0; i < arr.size(); ++i)count[arr[i]-min]++;for(i = 0; i < N; ++i){while(count[i]--)arr[j++] = i+min;}return arr;}
};

36 ms 16.1 MB

2.9 桶排序

  • 数据装桶,桶内快排
class Solution {	//桶排序
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j = 0, min, max;min = max = arr[0];for(i = 1; i < arr.size(); ++i){min = arr[i] < min ? arr[i] : min;max = arr[i] > max ? arr[i] : max;}if(min == max)return arr;int div = 1000;//桶个数int space = (max-min)/div+1;vector<int> temp(arr.size());vector<int> bucketsize(div,0);vector<int> bucketPos(div,0);for(i = 0; i < arr.size(); ++i)bucketsize[(arr[i]-min)/space]++;bucketPos[0] = bucketsize[0];for(i = 1; i < div; ++i)bucketPos[i] += bucketPos[i-1] + bucketsize[i];//桶结束位置的下一个for(i = 0; i < arr.size(); ++i)temp[--bucketPos[(arr[i]-min)/space]] = arr[i];for(i = 0; i < div; ++i){if(bucketsize[i] > 1){qsort(temp,bucketPos[i],bucketPos[i]+bucketsize[i]-1);}}for(i = 0; i < arr.size(); ++i)arr[i] = temp[i];return arr;}void qsort(vector<int>& arr, int l, int r){if(l >= r)return;int Pl = l, Pr = l;partition(arr,l,r,Pl,Pr);qsort(arr,l,Pl-1);qsort(arr,Pr+1,r);}void partition(vector<int>& arr, int l, int r, int& Pl, int& Pr){selectMid(arr,l,r);int P = arr[l];int i = l, j = r;while(i < j){while(i < j && P < arr[j])//没有等于号,哨兵都在左侧j--;swap(arr[i], arr[j]);while(i < j && arr[i] <= P)i++;swap(arr[i], arr[j]);}Pl = Pr = i;for(i = i-1; i >= l; --i){if(arr[i] == P){Pl--;swap(arr[i], arr[Pl]);}}}void selectMid(vector<int>& arr, int l, int r){int mid = l+((r-l)>>1);if(arr[mid] > arr[r])swap(arr[mid],arr[r]);if(arr[l] > arr[r])swap(arr[l], arr[r]);if(arr[mid] > arr[l])swap(arr[mid], arr[l]);}
};

40 ms 16.3 MB

2.10 基数排序

  • 注意处理负数,被坑了,负数%后越界,window不报错尽然。。
class Solution {	//基数排序vector<int> temp;
public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, max = INT_MIN;long exp;temp.resize(arr.size());for(i = 0; i < arr.size(); ++i){arr[i] += 50000;//便于负数处理max = arr[i] > max ? arr[i] : max;}for(exp = 1; max/exp > 0; exp*=10)radix_sort(arr,exp);for(i = 0; i < arr.size(); ++i)arr[i] -= 50000;//还原return arr;}void radix_sort(vector<int>& arr, long exp){vector<int> bucketsize(10,0);int i;for(i = 0; i < arr.size(); ++i)bucketsize[(arr[i]/exp)%10]++;for(i = 1; i < 10; ++i)bucketsize[i] += bucketsize[i-1];//桶最后一个位置+1for(i = arr.size()-1; i >= 0; --i)temp[--bucketsize[(arr[i]/exp)%10]] = arr[i];for(i = 0; i < arr.size(); ++i)arr[i] = temp[i];}
};

56 ms 16 MB

3. 复杂度表

图片参考 https://leetcode-cn.com/problems/sort-an-array/solution/shi-er-chong-pai-xu-suan-fa-bao-ni-man-yi-dai-gift/
在这里插入图片描述
r 为排序数字的范围,d 是数字总位数,k 是数字总个数

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

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

相关文章

顶会审稿人谈论文中稿“潜规则”

科研论文&#xff0c;不同于毕业论文之处在于——科研论文是根据有价值的生产实践或科研课题写作的&#xff0c;具有原创性和独到性的论文。在学术界&#xff0c;有人写论文是为了升硕士&#xff0c;升博士或者研究生博士顺利毕业。毕竟在学术界论文是工作和科研水平的直观体现…

python asyncio_如何使用Python中的asyncio?

【51CTO.com快译】Python的异步编程功能(简称async)让你可以编写不必等待独立任务完成就可以完成更多工作的程序。Python附带的asyncio库为你提供了使用async处理磁盘或网络I/O、无需其他方面等待的工具。 asyncio提供了两种处理异步操作的API&#xff1a;高级和低级。高级API用…

程序员面试金典 - 面试题 08.05. 递归乘法(位运算)

1. 题目 递归乘法。 写一个递归函数&#xff0c;不使用 * 运算符&#xff0c; 实现两个正整数的相乘。 可以使用加号、减号、位移&#xff0c;但要吝啬一些。 示例1:输入&#xff1a;A 1, B 10输出&#xff1a;10示例2:输入&#xff1a;A 3, B 4输出&#xff1a;12提示: …

最新整理完成

终于把主站做完了&#xff0c;用了一个小型的cms系统&#xff0c;因为买不起asp.net的空间&#xff0c;而且因为买的时候没问清楚&#xff0c;后来才知道限制cpu4%以内&#xff0c;才知道频繁的server unavaliable是多么的痛苦。我现在把修正后的新闻系统重新提供下载&#xff…

PromptCLUE:大规模多任务Prompt预训练中文开源模型

简介PromptCLUE&#xff1a;大规模多任务Prompt预训练中文开源模型。中文上的三大统一&#xff1a;统一模型框架&#xff0c;统一任务形式&#xff0c;统一应用方式。支持几十个不同类型的任务&#xff0c;具有较好的零样本学习能力和少样本学习能力。针对理解类任务&#xff0…

JS基础知识总结

前几天在网上看到的一个总结&#xff0c;觉得挺好的&#xff0c;所以记录了下来&#xff0c;以备查用。1 创建脚本块 1: <script language”JavaScript”>2: JavaScript code goes here3: </script> 2 隐藏脚本代码 1: <script language”JavaScript”>2: &…

程序员面试金典 - 面试题 10.02. 变位词组(哈希map)

1. 题目 编写一种方法&#xff0c;对字符串数组进行排序&#xff0c;将所有变位词组合在一起。 变位词是指字母相同&#xff0c;但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"]…

python3.7安装wordcloud_Python中的wordcloud库安装问题及解决方法

今天下载wordcloud的时候出现了很多问题&#xff0c;在此总结总结 1.问题一&#xff1a;You are using pip version 19.0.3, however version 20.0.2 is available…问题解决方法&#xff1a; 打开cmd输入如下命令 python -m pip install -U pip 2.问题二&#xff1a;error: Mi…

互联网最值得加入的173家国企汇总

文 | 重庆搬砖喵、王二源 | 知乎今年的就业形势&#xff0c;实在是严峻。社招都这样&#xff0c;更别说应届生。虽然有一些垃圾国企&#xff0c;但仍然有非常多值得考虑的国企&#xff0c;毕竟优质的国企很稳定&#xff0c;不会像互联网一样担忧年纪大被裁员的情况发生&#xf…

LeetCode 1111. 有效括号的嵌套深度(奇偶分离)

1. 题目 有效括号字符串 仅由 "(" 和 ")" 构成&#xff0c;并符合下述几个条件之一&#xff1a; 空字符串连接&#xff0c;可以记作 AB&#xff08;A 与 B 连接&#xff09;&#xff0c;其中 A 和 B 都是有效括号字符串嵌套&#xff0c;可以记作 (A)&…

一首好听的音乐

昨天在不经意间突然听到一首超好听的曲子&#xff0c;来自班得瑞的《赞美主》,一直狂听好几个小时&#xff0c;音乐实在太美了&#xff0c;似同宁静的山谷中发出最自然的声音&#xff0c;让人心旷神怡&#xff0c;真是一种享受。一直以来都认为古典音乐是最美的&#xff0c;没想…

bpsk调制及解调实验_无线通信中的IQ调制,BPSK调制,QPSK调制,16QAM调制的理解...

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群先从IQ调制说起&#xff1a;IQ调制&#xff1a;IQ解调原理&#xff1a;Linux下使用GNU Octave运行下面的代码&#xff1a;MATLAB123456t-1:0.001:1;f1;ycos(2*pi*2*f*t);subplot(1,2,…

突发!图森未来CEO侯晓迪被罢免,公司疑遭SEC、FBI联手调查,市值一夜砍半

编辑 | 泽南、小舟来源 | 机器之心侯晓迪&#xff1a;我被「无故撤职」了。自动驾驶领域又有大事发生。著名自动驾驶卡车公司图森未来&#xff08;TuSimple, TSP&#xff09;10 月 31 日突然表示&#xff0c;已将首席执行官兼联合创始人侯晓迪解雇&#xff0c;该决定立即生效。…

异常处理的最佳习惯

一个被良好设计的错误处理代码块集可以让程序更健壮并且面临更少的崩溃机会&#xff0c;因为这样的应用程序对错误进行了处理。下面的列表包含了异常处理最佳习惯中的建议&#xff1a;知道什么时候要设立 try/catch 块。例如&#xff0c;你可以通过编程来检查可能发生在使用异常…

LeetCode 299. 猜数字游戏

1. 题目 你正在和你的朋友玩 猜数字&#xff08;Bulls and Cows&#xff09;游戏&#xff1a;你写下一个数字让你的朋友猜。 每次他猜测后&#xff0c;你给他一个提示&#xff0c;告诉他有多少位数字和确切位置都猜对了&#xff08;称为“Bulls”, 公牛&#xff09;&#xff0…

手机内部零件名称图解_旧手机回收后都干嘛了?

以下为正文有问题不懂&#xff1f;有事情不知道&#xff1f;疑难问题需要求解&#xff1f;快来汉中艾特闹APP提问贴心小编和60万汉中艾特闹粉丝为你解答‍汉中艾特闹APP【有问必答】栏目已上线新一期网友提问来了↓↓↓网友提问旧手机回收后都干嘛了&#xff1f;对此问题&#…

AI取代人类,可以自动生成prompt了

文 | 智商掉了一地如何才能让大型语言模型按照我们的要求去做&#xff1f;这篇文章给出了回答——近期在 NLP 领域风很大的话题莫过于 Prompt&#xff0c;尤其当大型语言模型&#xff08;LLM&#xff09;与其结合&#xff0c;更是拉近了我们与应用领域之间的距离&#xff0c;当…

Atmospheric Scattering

以前由于硬件限制&#xff0c;很多游戏的天空和地面颜色主要是用贴图模拟&#xff0c;近来硬件的发展&#xff0c;越来越多的游戏开始采用基于比较真实的大气散射模型来实时计算。很多文章的计算最终都将眼睛高度和角度作为参数&#xff0c;这里主要按照Sean O’Neil系列的方法…

程序员面试金典 - 面试题 10.11. 峰与谷(排序/不排序)

1. 题目 在一个整数数组中&#xff0c;“峰”是大于或等于相邻整数的元素&#xff0c;相应地&#xff0c;“谷”是小于或等于相邻整数的元素。 例如&#xff0c;在数组{5, 8, 2, 6, 3, 4, 3}中&#xff0c;{8, 6}是峰&#xff0c; {3, 2}是谷。 现在给定一个整数数组&#xf…

计算机视觉自学进阶路上不可忽略的几个原创公众号

人工智能行业目前已接近饱和状态&#xff0c;如何从内卷中脱颖而出&#xff0c;除了极强的自律之外&#xff0c;系统性的学习方法也很重要。今天给大家推荐10个原创公众号&#xff0c;这些公众号定期会发些高质量原创&#xff0c;希望可以让你更高效的学习。深度学习与图网络最…