实现compareTo方法
必须是全序关系

  1. 非对称性
  2. 传递性
  3. 完全性

选择排序

遍历找到未排序部分的最小值,放到已排序部分的末尾(从小到大排序,反之则是找最大值)
N^2/2 compares and N exchanges

image.png
image.png

Running time insensitive to input. Quadratic time, even if input is sorted.
Data movement is minimal. Linear number of exchanges.

插入排序

以从小到大排序举例
已排序的部分A在整个队列左侧,未排序的部分B在队列右侧

  1. 从未排序的部分拿出第一个元素x(未排序部分最左端,已排序部分的右端)
  2. 将x与它左侧的元素y进行比较(x的左侧始终是从小到大已排序的)
  3. 为了保证加入x后,队列A依然是从小到大有序的,因此如果x比y小,则x、y交换位置,跳到 步骤2 继续执行,如果x比y大,此时加入x元素后的已排序部分A从小到大有序,跳到 步骤1 继续执行

image.png
image.png
image.png

希尔排序(shellsort)

h-sort

将整个需要排序的队列每 h 个单元作为一个独立的队列进行插入排序
image.png
image.png

定理:经过排序后,使g有序的序列A变为h有序(h < g),则序列A仍然是g有序的
image.png
来自知乎的证明 希尔排序合理性的证明

对一个序列进行排序,h-sort中 h 取何队列效率最高?
image.png
powers of two 只对第偶数位的数进行了排序
3x + 1 方便编程,效率也很高
Sedgewick(塞奇威克,人名) 实践得出的最佳h序列 (非理论最佳,可能会有更优解)

希尔排序适用于所有的序列吗?
适用于中小规模队列,巨大规模的序列效果不佳

复杂度分析
精确模型还没证明,不同的h序列复杂度不一样
对于3x + 1 序列复杂度为O(N^1.5)
算法导论------ShellSort希尔排序

代码实现
image.png

洗牌

一个较好的洗牌代码

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

image.png

凸包(Convex hull)

知识点:

  1. 葛立恒扫描法
  2. 简并现象(点在凸包边上但不是凸包的顶点)

image.png
image.png
image.png


ahtlzj
1 声望1 粉丝

人工智能成长ing, 关注我就是关注一个潜力股