文章目录

  • 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 是数字总个数

LeetCode 912. 排序数组(10种排序)相关推荐

  1. 10种排序算法基础总结

    基于比较的排序: 基础排序:  冒泡排序:谁大谁上,每一轮都把最大的顶到天花板 效率太低--掌握swap. 选择排序:效率较低,但经常用它内部的循环方式来找最大值和最小值. 插入排序:虽然平均效率低, ...

  2. LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置

    前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...

  3. 常见的10种排序算法

    前言 排序算法是在生活中随处可见,也是算法基础 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比 ...

  4. 17种编程语言+10种排序算法

    开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort 覆盖语言:C.C++.C#.Java.Kotlin.Dart.Go.JavaScr ...

  5. mysql分组后组内排序_图解排序 3/10 希尔排序

    希尔排序,它是由 D.L.Shell 于1959 年提出而得名.根据它的名字很难想象算法的核心思想.[ 所以只能死记硬背了,面试官问:希尔排序的思想是什么?].它的核心思想是把一个序列分组,对分组后的 ...

  6. js排序数组并返回排序后原数组的索引排序

    背景:最近一朋友面试,二面机试题,题目大意是: 从百度天气的一个api取得天气数据,前端展示天气数据,穿衣指数,点击温度栏进行一个升温降温排序,以及不排序 接口地址:http://api.map.ba ...

  7. excel表格排序,4种排序教程全都有

    excel具备直观的界面.出色的计算功能和图表工具,其中excel可以对庞大的数据源利用排序进行快速整理,使数据一目了然并且美观,excel表格排序的具体流程是怎样的呢?小编给大家罗列了4种排序教程! ...

  8. 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)

    本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...

  9. 10种 排序算法 稳定性,复杂度的分析

    排序相关概念 排序项:排序依据的数据 关键码:主关键码,次关键码,主关键码对于任意排序的序列结果唯一,关键码是次关键码排序结果不一定唯一,由于才可能存在相同的关键值记录. 内部排序:排序过程中全放入内 ...

最新文章

  1. springboot~openfeign从JSON文件读取数据
  2. @include与jsp:include的区别
  3. scrapy two
  4. 多点生活在 Service Mesh 上的实践
  5. php m grep event,linux grep (linux查找关键字在php出现的次数)
  6. C++常见错误:LINK:fatal error LNL1123:转换到COFF期间失败,文件无效或者损坏
  7. macbook里软件打不开说是没有权限
  8. 总用量的统计_每月公开使用量!广州市开启机制砂信息采集工作
  9. localhost改ip访问
  10. 手机计算机软件删除了怎么恢复,手机卸载的软件怎么恢复?手机卸载的软件恢复方法介绍...
  11. 制作影像(dmg)文件详细步骤
  12. 1000瓶水10只小白鼠问题-面试题目
  13. linux怎么给用户777权限,linux下 chmod 777 中777这个数字是怎么出来的
  14. vue 之 路由懒加载
  15. 转贴和菜头的曝脸存照
  16. 使用AVplayer播放在线音频遇到的问题
  17. 想转行人工智能?机会来了!!!
  18. 安装微软官方提供的win 10 PE 系统到U盘
  19. 计算机及相关专业的同学如何规划大学四年?
  20. [转载]DBA的特质第二部分:性格

热门文章

  1. 农用地包括哪些地类_土地地类一览表
  2. Spring Boot之自定义属性
  3. YAML/Properties配置文件与Spring Boot(转)
  4. C. Jon Snow and his Favourite Number DP + 注意数值大小
  5. 常用的几种编程语言的介绍
  6. 在centos7环境下建立MariaDB多实例
  7. 您的WebApp真的需要jQuery吗?
  8. 排序算法之两路归并排序(Java)
  9. Linux驱动程序的数据封装
  10. 一个风骚的C语言操作