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

示例 1:
输入:[5,2,3,1]
输出:[1,2,3,5]

示例 2:
输入:[5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

各排序算法解法如下: (如想要了解算法排序原理,见> 十大算法)

public class _912排序数组 {public int[] sortArray(int[] nums) {if(nums.length <=1)return nums;//qSort(nums,0,nums.length-1);//selectSort(nums);// insertSort(nums);// shellSort(nums);// bucketSort(nums);// countSort(nums);// mergeSort(nums,0,nums.length-1);heapSort(nums);return nums;}/**快速排序**/void qSort(int[] arr,int s,int e){int l = s, r = e;if(l < r){int temp = arr[l];while(l < r){while(l < r && arr[r] >= temp) r--;if(l < r) arr[l] = arr[r];while(l < r && arr[l] < temp) l++;if(l < r) arr[r] = arr[l];}arr[l] = temp;qSort(arr,s,l);qSort(arr,l + 1, e);}}/**选择排序**/void selectSort(int[] arr){int min;for(int i = 0;i<arr.length;i++){min = i;for(int j = i;j<arr.length;j++){if(arr[j] < arr[min]){min = j;}}if(min != i) {int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}}/**** 插入排序:数列前面部分看为有序,依次将后面的无序数列元素插入到前面的有序数列中,初始状态有序数列仅有一个元素,即首元素。在将无序数列元素插入有序数列的过程中,采用了逆序遍历有序数列,相较于顺序遍历会稍显繁琐,但当数列本身已近排序状态效率会更高。** 时间复杂度:O(N2)   稳定性:稳定* @param arr*/public void insertSort(int arr[]){for(int i = 1; i < arr.length; i++){int rt = arr[i];for(int j = i - 1; j >= 0; j--){if(rt < arr[j]){arr[j + 1] = arr[j];arr[j] = rt;}else{break;}}}}/*** 希尔排序 - 插入排序的改进版。为了减少数据的移动次数,在初始序列较大时取较大的步长,通常取序列长度的一半,此时只有两个元素比较,交换一次;之后步长依次减半直至步长为1,即为插入排序,由于此时序列已接近有序,故插入元素时数据移动的次数会相对较少,效率得到了提高。** 时间复杂度:通常认为是O(N3/2) ,未验证  稳定性:不稳定* @param arr*/void shellSort(int arr[]){int d = arr.length >> 1;while(d >= 1){for(int i = d; i < arr.length; i++){int rt = arr[i];for(int j = i - d; j >= 0; j -= d){if(rt < arr[j]){arr[j + d] = arr[j];arr[j] = rt;}else break;}}d >>= 1;}}/*** 桶排序 - 实现线性排序,但当元素间值得大小有较大差距时会带来内存空间的较大浪费。首先,找出待排序列中得最大元素max,申请内存大小为max + 1的桶(数组)并初始化为0;然后,遍历排序数列,并依次将每个元素作为下标的桶元素值自增1;* 最后,遍历桶元素,并依次将值非0的元素下标值载入排序数列(桶元素>1表明有值大小相等的元素,此时依次将他们载入排序数列),遍历完成,排序数列便为有序数列。** 时间复杂度:O(x*N)   稳定性:稳定* @param arr*/void bucketSort(int[] arr){int[] bk = new int[50000 * 2 + 1];for(int i = 0; i < arr.length; i++){bk[arr[i] + 50000] += 1;}int ar = 0;for(int i = 0; i < bk.length; i++){for(int j = bk[i]; j > 0; j--){arr[ar++] = i - 50000;}}}/*** 基数排序 - 桶排序的改进版,桶的大小固定为10,减少了内存空间的开销。首先,找出待排序列中得最大元素max,并依次按max的低位到高位对所有元素排序;* 桶元素10个元素的大小即为待排序数列元素对应数值为相等元素的个数,即每次遍历待排序数列,桶将其按对应数值位大小分为了10个层级,桶内元素值得和为待排序数列元素个数。* @param arr*/void countSort(int[] arr){int[] bk = new int[19];Integer max = Integer.MIN_VALUE;for(int i = 0; i < arr.length; i++){if(max < Math.abs(arr[i])) max = arr[i];}if(max < 0) max = -max;max = max.toString().length();int [][] bd = new int[19][arr.length];for(int k = 0; k < max; k++) {for (int i = 0; i < arr.length; i++) {int value = (int)(arr[i] / (Math.pow(10,k)) % 10);bd[value+9][bk[value+9]++] = arr[i];}int fl = 0;for(int l = 0; l < 19; l++){if(bk[l] != 0){for(int s = 0; s < bk[l]; s++){arr[fl++] = bd[l][s];}}}bk = new int[19];fl = 0;}}/*** 归并排序 - 采用了分治和递归的思想,递归&分治-排序整个数列如同排序两个有序数列,依次执行这个过程直至排序末端的两个元素,再依次向上层输送排序好的两个子列进行排序直至整个数列有序(类比二叉树的思想,from down to up)。** 时间复杂度:O(NlogN)   稳定性:稳定* @param arr*/void mergeSortInOrder(int[] arr,int bgn,int mid, int end){int l = bgn, m = mid +1, e = end;int[] arrs = new int[end - bgn + 1];int k = 0;while(l <= mid && m <= e){if(arr[l] < arr[m]){arrs[k++] = arr[l++];}else{arrs[k++] = arr[m++];}}while(l <= mid){arrs[k++] = arr[l++];}while(m <= e){arrs[k++] = arr[m++];}for(int i = 0; i < arrs.length; i++){arr[i + bgn] = arrs[i];}}void mergeSort(int[] arr, int bgn, int end){if(bgn >= end){return;}int mid = (bgn + end) >> 1;mergeSort(arr,bgn,mid);mergeSort(arr,mid + 1, end);mergeSortInOrder(arr,bgn,mid,end);}/*** 堆排序 - 堆排序的思想借助于二叉堆中的最大堆得以实现。首先,将待排序数列抽象为二叉树,并构造出最大堆;然后,依次将最大元素(即根节点元素)与待排序数列的最后一个元素交换(即二叉树最深层最右边的叶子结点元素);* 每次遍历,刷新最后一个元素的位置(自减1),直至其与首元素相交,即完成排序。** 时间复杂度:O(NlogN)   稳定性:不稳定** @param arr*/void heapSort(int[] nums) {int size = nums.length;for (int i = size/2-1; i >=0; i--) {adjust(nums, size, i);}for (int i = size - 1; i >= 1; i--) {int temp = nums[0];nums[0] = nums[i];nums[i] = temp;adjust(nums, i, 0);}}void adjust(int []nums, int len, int index) {int l = 2 * index + 1;int r = 2 * index + 2;int maxIndex = index;if (l<len&&nums[l]>nums[maxIndex])maxIndex = l;if (r<len&&nums[r]>nums[maxIndex])maxIndex = r;if (maxIndex != index) {int temp = nums[maxIndex];nums[maxIndex] = nums[index];nums[index] = temp;adjust(nums, len, maxIndex);}}
}

以上!

伍六七带你学算法 进阶篇-排序算法相关推荐

  1. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  2. 伍六七带你学算法 进阶篇-三数之和

    三数之和 难度-中等 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  3. 伍六七带你学算法 入门篇 ——最大子序和

    力扣 53. 最大子序和 难度简单 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4 ...

  4. 伍六七带你学算法 入门篇-卡牌分组

    力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题,提交通过率令人深思 ,思考它是不是一道简单的题- 开始正题: 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以 ...

  5. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

  6. 伍六七带你学算法——栈的使用

    大家都知道栈这种数据结构,它有非常多的应用场景.但如果我们不经常接触这些应用场景的话,就可能不太熟悉栈的用法. 目录smd 1.栈的创建和使用 JAVA Stack类: 2.栈的实际应用示范 解题如下

  7. 伍六七带你学算法——被忽视的数学公式

    中学时候学习那么多的数学,却没有人告诉我们这些数学公式我们以后会用到哪里?疑惑了十好几年,直到,你进入it行业,它的舞台来了! 在力扣上有一道中度难度的题,题目是这样的

  8. 伍六七带你学算法 动态规划 ——不同路径

    力扣 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格 ...

  9. 伍六七带你学算法 入门篇——最后一个单词的长度

    难度 简单 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说 ...

最新文章

  1. VS2010与Qt设置出现红线提示
  2. iOS:自己写的一个星级评价的小Demo
  3. property Alternative forms propretie
  4. 二章: CentOS6.5 连接FTP服务器、部署telnet服务、安装SCP、服务端FTP、SFTP部署
  5. '$.browser.msie' 为空或不是对象
  6. asp.net页面中hmtl注释的问题
  7. linux 创建精灵进程,linux 进程通信之 守护进程
  8. 计算机编程语言的分类与python语言快速度认识
  9. 【实习之T100开发】T100程序功能代码积累
  10. python简单代码大全-python代码大全
  11. Axure element 2.4.6元件库
  12. android x5全屏白色,x5webview 自定义全屏界面(示例代码)
  13. 半导体芯片产业链公司大全
  14. 真格量化的回测交易撮合机制简介
  15. html单元格边框斜线,excel表头三斜线 将线条的两端放在单元格的边框上
  16. c语言舍弃字符串的前一部分,C语言札记
  17. 如何提高项目交付效率
  18. react基于WOW.js和Animate.css实现特定位置的动画执行
  19. Imx6ull 开发板通过Uboot使用网络启动系统
  20. 写在2021最后一天

热门文章

  1. 2022-2028年中国煤制甲醇产业投资分析及前景预测报告
  2. pip install 豆瓣源、清华源、阿里源、中国科技大学源
  3. 揭富人与穷人21个不同思维 看富豪如何脱颖而出
  4. Mysql生成UUID
  5. tensorflow 1.x Saver(保存与加载模型) 预测
  6. Jupyter Magic - Timing(%%time %time %timeit)
  7. LeetCode简单题之两个相同字符之间的最长子字符串
  8. LeetCode简单题之至少是其他数字两倍的最大数
  9. 前后端分离必备工具:Swagger快速搞定(整合SpringBoot详细教程)
  10. Dorado用法与示例