leetcode上的排序题大多基于排序的应用,几乎不涉及对经典排序算法的实现,类似147链表插入排序。下面就对排序算法稍微做一点总结。
排序分为基于比较的排序和非比较排序。
比较排序主要有:冒泡排序,选择排序,插入排序(基于二分查找的插入排序/希尔排序(分组插入排序)),归并排序,堆排序,快速排序。
希尔排序利用了在待排记录基本有序,直接插入排序效率增加的特性,取大步长将全部元素分成几个区域分别进行插入排序,再取越来越小的步长进行排序,此时需排序数据基本有序,插入排序速度较快。
归并排序的递归实现本质上是分支策略的典型应用,分解,求解,组合。
非递归实现是两两归并,四四归并,八八归并...
堆排序利用堆数据结构设计的一种选择排序算法,待排序记录序列用完全二叉树表示(通过一维数组)过程如下
快速排序因其效率较高,在很多场合中被使用,笔面试题中也经常出现,基本实现步骤如图
另外还有填坑法快速排序
下面给出一张性能比较表格
排序算法稳定性的简单形式化定义为:如果Ai = Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的。通俗地讲就是保证排序前后两个相等的数的相对顺序不变。即如果需求需保持初始的排序,那么稳定性排序将有意义。
常用排序算法总结 这篇博客写的比较详细,推荐一看
75. Sort Colors
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。