题意描述:

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

数据范围 1 <= A.length <= 10000 ,-50000 <= A[i] <= 50000


示例:

输入:[5,2,3,1]
输出:[1,2,3,5]
输入:[5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

解题思路:
Alice: 排序的N种写法 ??
Bob: 看来是的。
Alice: 桶排序
Bob:桶就像是 Python 中的字典,或者 Java 中的 map, 记录每个元素出现的次数,然后按照 key 的大小遍历 字典,得到的就是从小到大有序的数组。只不过我们是直接用数组实现的,开了一个很大的数组记录每个元素出现的次数,如果是字典,内存消耗会小很多,但是字典好像没有办法保证按照 key 的大小遍历。
Alice: 不错不错。选择排序
Bob: 选择排序就是 每次找出 第 k 小的元素放到 下标是 k-1 的位置上,外层循环可以是 n-1 次,因为第 n-1 小的元素归位后,整个数组就已经是有序的了。
Alice: 插入排序
Bob: 插入排序就是不断往左侧有序的数组中插入元素,并且维持左侧的数组始终有序。
Alice: 插入排序是怎么实现插入的呢? 怎么找到要插入的位置呢?
Bob: 插入有两种实现方式,一种是不断交换相邻元素的值,直到待插入的元素被交换到要插入的位置,第二种就是循环找到要插入的位置,然后交换一次。
Alice: 插入排序就是将 第 1,2,3…个位置的元素依次插入到左侧的数组中去,这就是外层循环所做的事情。
Bob: 是的,然后还有快速排序 ?
Alice: 快速排序就是 划分数组, 首先选定一个 主元,第一次划分的结果是,这个主元归位到正确的位置, 左侧的元素都比这个主元小,右侧的元素都比这个主元大。然后对左侧的数组再划分,对右侧的数组也再划分,递归下去,一直到待划分的数组长度是1的时候就是递归终止的时候。不错,怎么确定 主元呢 ? 可以随机选取,不过一般都是指定待排序数组最左侧或者最右侧的元素。划分的具体实现,就是在数组两侧找到两个需要交换的元素,然后交换位置。交换的实现方式也有两种,一种是直接交换,一种是通过 “覆盖” 的方法分两次 将待交换的元素防止到正确的位置上。
Bob: 那我来讲一个归并排序吧,归并排序的本质就是利用递归不断的合并两个有序数组。合并两个有序数组就是一个双指针的问题,然后归并排序就是在先划分整个数组为很多小数组,然后在合并有序数组。
Alice: 我讲一下冒泡排序吧,冒泡排序就是通过比较和交换相邻元素实现每趟将一个最大值或者最小值冒泡到数组末尾或者头部的算法,它的时间复杂度是O(n*2)。内外两层循环都可以做一些优化的操作。
Bob:还有希尔排序,希尔排序是插入排序的优化版本,插入排序是直接不断的将元素插入到一个有序数组中去。希尔排序是先将数组划分为若干个小数组,在小数组内部不断使用插入排序,这样整个大数组也是逐渐有序的,最后再对整个数组使用插入排序。希尔排序虽然写起来是三重循环,但是它的平均时间复杂度是 O(n log n)。
Alice: 堆排序,堆排序要在一个数组中建立完全二叉树,然后通过这个二叉树来维护大顶堆。这个二叉树有个特点,leftIndex = rootIndex * 2 + 1, rightIndex = rootIndex * 2 + 2 == leftIndex + 1
然后排序的过程就是先建立一个大顶堆,大顶堆的定义是对二叉树中的每个节点,父节点的值要大于或者等于两个子节点的值。建完之后,将堆顶的元素交换到数组末尾,然后在[0, length-k] 的范再维护大顶堆,虽然是在数组中建立完全二叉树,但是却没有使用递归。堆排序还是很不错的。
Bob: 终于总结完了哈。
Alice: 还早着呢,还有什么随机排序,基数排序,排序的稳定性分析呢 !
Bob:

LeetCode-912-排序数组相关推荐

  1. Leetcode 912.排序数组(Sort an Array)

    Leetcode 912.排序数组 1 题目描述(Leetcode题目链接)   给定一个整数数组 nums,将该数组升序排列. 输入:[5,2,3,1] 输出:[1,2,3,5] 输入:[5,1,1 ...

  2. Leetcode.912 排序数组

    题目链接 Leetcode.912 排序数组 mid 题目描述 给你一个整数数组 n u m s nums nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出: ...

  3. LeetCode 912. 排序数组(Java)

    912. 排序数组 你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 提示: 1 <= nums.length &l ...

  4. LeetCode 912. 排序数组【模板题】

    912. 排序数组 [快排] class Solution {// 快速排序 7:32 13void quickSort(int[] nums, int l, int r){if(l >= r) ...

  5. LeetCode[912]排序数组

    难度:Medium 题目: 给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = [5,1, ...

  6. 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 ...

  7. 2022-4-9 Leetcode 912.排序数组

    第一版,使用库函数 `class Solution {public:vector<int> sortArray(vector<int>& nums) {sort(num ...

  8. [leetcode] 912.排序数组

    给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = [5,1,1,2,0,0] 输出:[0 ...

  9. LeetCode 912. 排序数组-快排(C++)

    本题是华为一面手撕题目. 快排的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程 ...

  10. LeetCode删除排序数组中的重复项(Java实现)

    原题: 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件 ...

最新文章

  1. MIT请来了一群经济学家,就AI是否会带来大规模失业展开了一场辩论
  2. Lambda表达式【转】
  3. java string底层实现_Java-学习日记(Shell与String底层原理)
  4. Java 8:开发人员怎么看?
  5. 计算机上的框英文,电脑打开steam平台弹出一个英文框的解决方法
  6. 推荐一个腾讯大神的免费直播课!
  7. “黑客”深度学习之“游戏外挂原理实现”之美
  8. AutoCAD2006安装破解图文教程
  9. 验证18位身份证真实性
  10. VTK图像处理之访问图像像素值
  11. 移动互联网技术(wifi)
  12. English—句子
  13. 如何给物体添加阴影效果
  14. 飞凌嵌入式-基于国产A40i核心板-医用呼吸机解决方案
  15. ERROR 1010 (HY000): Error dropping database (can‘t rmdir ‘.\qpweb‘, errno: 41) 删库失败问题的解决
  16. dsp图像处理Prewitt算子边缘检测
  17. 【机器学习】线性判别式(LDA/FLD)
  18. 3d全息投影技术在教学中有什么好处
  19. 两套工厂通用ERP系统【源代码免费分享】
  20. 闲聊一下吧,发发牢骚,嘿嘿

热门文章

  1. STM32之GPIO工作模式
  2. 20杭电计算机专业考研科目,20杭电计算机菜鸡跨考经验贴
  3. @loj - 2289@「THUWC 2017」在美妙的数学王国中畅游
  4. 杀linux进程的几种命令详解
  5. 着急使用新西兰无犯罪文件怎么办理新西兰使馆认证呢
  6. mysql 5.7 xbackup_mysql5.7备份
  7. 远程桌面协议报错0xd06解决方案
  8. C# WinForm创建Excel文件
  9. SolrCloud部署和使用手册
  10. Unity3D 自学之路