排序算法一览

快排
插入排序
希尔排序
桶排序
计数排序
归并排序
桶排序

class Solution {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;}

快排

思路:用两个指针分别指向数组的开始位置和结束位置,取开始位置元素作为基准,从右边开始,向左依次与基准比较大小,如果右边的元素大于基准,则位置正确,指针继续向前滑动,否则退出循环。然后从左边开始,向右依次与基准比较大小,如果左边元素小于基准,则位置正确,指针继续向后滑动,否则退出循环。交换左右两边位置不正确的元素。当两个指针相遇时,将基准放到它应该在的位置上。递归排序基准左边的数组和基准右边的数组。

    public void quickSort(int[] nums, int left, int right){if(left > right){return;}int i = left;int j = right;int pivot = nums[left];while(i<j){while(i<j&&nums[j]>=pivot){j--;}while(i<j&&nums[i]<=pivot){i++;}if(i<j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;      }}nums[left] = nums[i];//中心位nums[i] = pivot;quickSort(nums, left, j-1);quickSort(nums, j+1, right);}
}

选择排序

思路:遍历数组的每个位置,确保该位置后的所有数都比它大。一个循环用来遍历数组,一个循环用来和当前位置进行比较,找到最小的索引。然后交换索引对应位置的数值,保证最小的在前面。

 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(N2N^2N2)   稳定性:稳定

 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)O(N^{3/2})O(N3/2) ,不稳定

 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)   稳定性:稳定

  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个层级,桶内元素值得和为待排序数列元素个数。

 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) ,稳定

     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),不稳定

 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);}}
}

【LeetCode】3月31日打卡-Day16-数组排序算法汇总相关推荐

  1. 早报八点半:5月31日Web3加密行业每日新闻汇总

    [数据指标] 加密货币总市值:$1.33万亿 BTC市值占比:44.92% 恐慌贪婪指数:16 极度恐慌   [今日快讯] 1.[政讯] 1.1.光大银行分析师:针对稳定币风险要出台针对性的监管措施 ...

  2. leetcode.cn 2022年11月4日 打卡题 754. 到达终点数字【一元二次方程解法,时间复杂度O(1)】

    leetcode 2022年11月4日 打卡题 754. 到达终点数字 写在前面   首先感谢 @子不语 大佬发布的一元二次方程代码实现的启发.题解链接:子不语-754. 到达终点数字   本文侧重梳 ...

  3. 攻城时服务器维护,8月31日服务器维护更新公告

    亲爱的<千年3>玩家: 2017年8月31日10:00-14:00将对全区进行服务器例行维护,预计所需时间约为4个小时,如在维护期间无法完成维护内容,开机时间将顺延. 本次更新内容包含: ...

  4. 天刀霸王枪服务器怎么维护了,1月31日服务器例行维护公告(已完成)

    亲爱的玩家: 青龙乱舞区.大地飞鹰区.血海飘香区.陌上花开区.天命风流区.沧海云帆区全部服务器将在1月31日6:00~8:00停机维护更新,维护完成后上述各服务器客户端版本更新至2.0.47.7,本次 ...

  5. 因服务器升级维护平安京怎么办,阴阳师12月31日维护更新公告_阴阳师12月31日更新了什么_玩游戏网...

    在阴阳师手游中12月31日更新了哪些有趣的内容呢?在本次维护更新相信大家对此也都是相当关心的呢!那么不清楚的话下面就来看一下吧! 亲爱的阴阳师大人 为了给大家带来史好的游戏体验,服务器将于12月31日 ...

  6. 平安京因服务器升级维护无法,《阴阳师》手游12月31日维护更新公告

    亲爱的阴阳师大人: 为了给大家带来更好的游戏体验,服务器将于12月31日(周二)早上6:30-9:00进行停服维护,如未能按时完成,则开服时间将会顺延.具体更新详情请留意稍后更新公告,或维护结束后至游 ...

  7. 最新县及县以上行政区划代码(截止2016年7月31日)

    最新县及县以上行政区划代码(截止2016年7月31日),数据整理来源于国家统计局官方公布. 110000|北京市110100|市辖区110101|东城区110102|西城区110105|朝阳区1101 ...

  8. ios王者荣耀服务器维护31号,王者荣耀3月31日IOS无法更新什么情况?王者荣耀ios更新特别慢解决方法...

    3月31日王者荣耀ios版更新不了怎么办?王者荣耀ios版每次大版本更新的时候总是会比安卓版出现更多的问题,比较的常见的就是更新失败,更新很卡,或者是没有出现更新按钮等等问题,这不今天的大版本更新又遇 ...

  9. pubg服务器维护公告7月31日,2021绝地求生3月31日更新公告_3.31更新维护内容一览_3DM网游...

    游戏<绝地求生>中,今日官方对游戏进行了近一步的优化来到了第11赛季.那么2021年3月31日更新公告是什么?很多玩家并不了解,一起来看3.31更新维护内容一览吧. 3.31更新维护内容一 ...

最新文章

  1. 【深度学习理论】(3) 激活函数
  2. 单片机开发工程师需要学哪些,单片机工作的基本条件
  3. DelphiX教程系列 1 - 使用键盘和摇杆
  4. PostgreSQL学习笔记6之函数和操作符二
  5. python解决问题asp_用python实现面向对像的ASP程序实例
  6. 【图像超分辨率】Perceptual Losses for Real-Time Style Transfer and Super-Resolution
  7. 【追加功能】OFFICE插件管理工具重整后再上路,更好用易用。
  8. java service wrapper jar 服务_javaservice wrapper 实现注册服务功能
  9. batchplot放到哪个文件夹_Batchplot使用技巧,转换CAD图纸格式并实现批量打印
  10. 什么是软件 什么是硬件
  11. bzoj 1688: [Usaco2005 Open]Disease Manangement 疾病管理(状压)
  12. neokylin linux s.iso,NeoKylin-Desktop-Personal-v6.0安装与基本应用实战
  13. python正则取反,一文搞定Python正则表达式
  14. C中printf()的常用输出
  15. 中文语音合成综合评测一(可懂度)
  16. 实现图书馆检索图书功能
  17. 使用u盘安装Red Hat Enterprise 6.0
  18. Mac Grapher(图形软件)
  19. 紧随小米2:LG Optimus G也用高通四核APQ8064
  20. 【转】win10哪个版本最好用,推荐win10企业版LTSC

热门文章

  1. Android ANR 实例分析
  2. ubuntu下面的git服务器搭建
  3. Cortex M3 NVIC与中断控制
  4. who|sort实现
  5. qtscrcpy自定义按键_按键映射说明.md
  6. matalotlib(2)
  7. Vue动态组件和组件缓存
  8. LeetCode 2191. 将杂乱无章的数字排序(自定义排序)
  9. LeetCode 2176. 统计数组中相等且可以被整除的数对
  10. LeetCode LCP 30. 魔塔游戏(优先队列)