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

排序算法一览

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

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

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

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

相关文章

如何打造高质量的NLP数据集

今天发烧睡了一天T^T&#xff0c;睡醒后突然想起这个都快凉透的订阅号&#xff0c;刷了刷知乎&#xff0c;刷到了这个问题知乎&#xff1a;如何打造高质量的机器学习数据集&#xff1f; https://www.zhihu.com/question/333074061/answer/773825458于是就有了暖暖卖萌屋的冲动(…

郑杰 | 如何拿回我们自己的医疗数据?

本文转载自公众号造就&#xff0c;作者郑杰&#xff0c;树兰医疗总裁&#xff0c;OMAHA 开放医疗与健康联盟发起人。 造就 大家好&#xff0c;我是郑杰&#xff0c;来自于杭州。我出生于一个医生世家&#xff0c;也在医院边上长大&#xff0c;但大学里我读的是计算机专业&#…

【Java】Object类、Objects类和日期类

1 Object类 Object类是所有类的父类&#xff0c;每个类都直接或间接的继承自该类 1.1 Object.toString() 作用&#xff1a;打印输出类信息 重写前&#xff1a;打印输出包名类名地址值 重写后&#xff1a;打印输出属性值 1.2 Object.equals() 作用&#xff1a;比较两个对象…

问题对语义相似度计算-参赛总结

时间段&#xff1a;2018.06.10~2018.07.20问题对语义相似度计算&#xff08;从0到0.5&#xff09; 短短一个多月的时间&#xff0c;我学到了很多很多东西&#xff0c;从一个呆头小白初长成人。首先&#xff0c;必须感谢我的导师能给我这个机会从头到尾完整地参加这次比赛&#…

后BERT时代:15个预训练模型对比分析与关键点探究

前言在小夕之前写过的《NLP的游戏规则从此改写&#xff1f;从word2vec, ELMo到BERT》一文中&#xff0c;介绍了从word2vec到ELMo再到BERT的发展路径。而在BERT出现之后的这大半年的时间里&#xff0c;模型预训练的方法又被Google、Facebook、微软、百度、OpenAI等极少数几个玩得…

技术论坛 | 10月22日在微软:“行业知识图谱+ ”论坛通知

大数据创新学习中心 《国务院新一代人工智能发展规划》的“跨媒体分析推理技术”强调“重点突破跨媒体统一表征、关联理解与知识挖掘、知识图谱构建与学习、知识演化与推理、智能描述与生成等技术”&#xff0c;为进一步了解知识图谱技术的应用场景&#xff0c;2017年10月22日在…

【Java】StringBuilder类、包装类

1 StringBuilder类 1.1 String的劣势 String类中字符串是常量&#xff0c;创建后不能更改 //底层是final修饰的数组 private final byte[] value;字符串相加&#xff0c;内存中会存在多个字符串&#xff0c;占用空间多&#xff0c;效率低下 1.2 StringBuilder的优势 Strin…

从贪心选择到探索决策:基于强化学习的多样性排序

本文主要介绍发表在SIGIR2018上的论文From Greedy Selection to Exploratory Decision-Making: Diverse Ranking with Policy-Value Networks​www.bigdatalab.ac.cn这篇论文利用强化学习来解决多样性排序问题&#xff0c;整体思路和AlphaGo类似。Motivation在信息检索领域一个…

对话系统聊天机器人的设计艺术(上)

前言关于本文的阅读方式&#xff1a;这不是一篇学术综述&#xff0c;也不是单纯的科普文&#xff0c;而是试图从目标出发来渐进式的思考对话系统的设计&#xff0c;顺便科普。因此本文不适合跳读&#xff0c;也不适合5分钟式浏览&#xff0c;而是适合在夜深人静的时候一个人...…

鲍捷 | 知识表示——面向实战的介绍

本文转载自文因互联 2016 年 6 月份组织的第一期北京知识图谱学习小组 Wiki。 知识表示&#xff08;Knowledge Representation&#xff0c;KR&#xff0c;也译为知识表现&#xff09;是如何将结构化数据组织&#xff0c;以便于机器处理和人的理解的方法。从结构推导出新的结构&…

【Java】Collection集合和泛型

学习目标&#xff1a;会存取&#xff0c;掌握特性 学习方式&#xff1a;学习顶层接口/抽象类的共性方法&#xff0c;使用底层的子类创建对象使用 1 集合框架 集合类的继承体系&#xff1a; Collection接口&#xff1a; 1) List接口&#xff1a;有序、允许重复、有索引 1.1) Ar…

]搜索引擎的文档相关性计算和检索模型(BM25/TF-IDF)

搜索引擎的检索模型-查询与文档的相关度计算1. 检索模型概述搜索结果排序时搜索引擎最核心的部分&#xff0c;很大程度度上决定了搜索引擎的质量好坏及用户满意度。实际搜索结果排序的因子有很多&#xff0c;但最主要的两个因素是用户查询和网页内容的相关度&#xff0c;以及网…

对话系统(任务型、检索式、生成式对话论文与工具串讲)

Motivation 对话是一个很大的概念&#xff0c;有非常非常多的子问题&#xff0c;刚入坑的小伙伴很可能迷失在对话的一小块区域里无法自拔&#xff0c;本文就是为解决这一类问题的。希望读者在看完本文后&#xff0c;可以理清楚对话的每个概念为什么而存在&#xff0c;以及它在整…

综述 | 知识图谱向量化表示

本文作者&#xff1a;窦洪健&#xff0c;2016级研究生&#xff0c;目前研究方向为推荐系统、文本生成&#xff0c;来自中国人民大学大数据管理与分析方法研究北京市重点实验室。 本文收录于RUC AI Box专栏&#xff0c;为该专栏特供稿件&#xff08;https://zhuanlan.zhihu.com/…

【LeetCode】4月2日打卡-Day18-矩阵操作

题1 生命游戏 描述 根据 百度百科 &#xff0c;生命游戏&#xff0c;简称为生命&#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a;1 即…

强化学习扫盲贴:从Q-learning到DQN

本文转载自知乎专栏「机器学习笔记」&#xff0c;原文作者「余帅」&#xff0c;链接https://zhuanlan.zhihu.com/p/358829371 本文学习目标1. 复习Q-Learning&#xff1b;2. 理解什么是值函数近似&#xff08;Function Approximation&#xff09;&#xff1b;3. 理解什么是DQN&…

【LeetCode】4月1日打卡-Day17-括号匹配/嵌套深度

题1 有效括号的嵌套深度 题解 要求划分出使得最大嵌套深度最小的分组&#xff0c;我们首先得知道如何计算嵌套深度。我们可以通过栈实现括号匹配来计算&#xff1a; 维护一个栈 s&#xff0c;从左至右遍历括号字符串中的每一个字符&#xff1a; 如果当前字符是 (&#xff0c;…

肖仰华 | 基于知识图谱的可解释人工智能:机遇与挑战

本文转载自公众号知识工场&#xff0c;整理自 2017 年 10 月 13 日肖仰华教授在 CIIS2017 中国智能产业高峰论坛上所做的报告。 肖仰华&#xff1a;很高兴有机会跟大家一起分享《基于知识图谱的可解释人工智能&#xff1a;机遇与挑战》。 刚才刘总的报告中提到了机器和人类将来…