实现compareTo方法
必须是全序关系
- 非对称性
- 传递性
- 完全性
选择排序
遍历找到未排序部分的最小值,放到已排序部分的末尾(从小到大排序,反之则是找最大值)
N^2/2 compares and N exchanges
Running time insensitive to input. Quadratic time, even if input is sorted.
Data movement is minimal. Linear number of exchanges.
插入排序
以从小到大排序举例
已排序的部分A在整个队列左侧,未排序的部分B在队列右侧
- 从未排序的部分拿出第一个元素x(未排序部分最左端,已排序部分的右端)
- 将x与它左侧的元素y进行比较(x的左侧始终是从小到大已排序的)
- 为了保证加入x后,队列A依然是从小到大有序的,因此如果x比y小,则x、y交换位置,跳到 步骤2 继续执行,如果x比y大,此时加入x元素后的已排序部分A从小到大有序,跳到 步骤1 继续执行
希尔排序(shellsort)
h-sort
将整个需要排序的队列每 h 个单元作为一个独立的队列进行插入排序
定理:经过排序后,使g有序的序列A变为h有序(h < g),则序列A仍然是g有序的
来自知乎的证明 希尔排序合理性的证明
对一个序列进行排序,h-sort中 h 取何队列效率最高?
powers of two 只对第偶数位的数进行了排序
3x + 1 方便编程,效率也很高
Sedgewick(塞奇威克,人名) 实践得出的最佳h序列 (非理论最佳,可能会有更优解)
希尔排序适用于所有的序列吗?
适用于中小规模队列,巨大规模的序列效果不佳
复杂度分析
精确模型还没证明,不同的h序列复杂度不一样
对于3x + 1 序列复杂度为O(N^1.5)
算法导论------ShellSort希尔排序
代码实现
洗牌
一个较好的洗牌代码
public class StdRandom
{
...
public static void shuffle(Object[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
{
int r = StdRandom.uniform(i + 1);
exch(a, i, r);
}
}
}
凸包(Convex hull)
知识点:
- 葛立恒扫描法
- 简并现象(点在凸包边上但不是凸包的顶点)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。