612.1.004 ALGS4 | Elementary Sorts - 基础排序算法

sublime编辑器写代码,命令行编译
减少对ide的依赖//可以提示缺少什么依赖import
所有示例代码动手敲一遍
Graham's Scan是经典的计算几何算法
shffule 与 map-reduce 有关—— 云计算
知道这些算法在身边切实的应用,对学习动力很有帮助
下一章开始,使用 git进行源代码管理!
先用来做自己的项目管理

Inspiration

计算机思维——不要重复造轮子
零件的通用性——拆分拆分再拆分,专业与分工细致

1.Callback = reference to executable code

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第1张图片

核心思想是将函数作为实参传递给其他函数
Interface-Java 使我们能够以类型安全的方式使用为任何类型的数据开发的排序算法

Roadmap

对象需要实现Compareble Interface()
这些数据类型具有重新实现compareTo()方法的实例方法

排序实现里与数据类型无关
具体的比较由Comparable 接口处理
612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第2张图片

What I can use —— code

  • Selection Sort | 选择排序
  • Insertion Sort | 插入排序
  • ShellSort | 希尔排序

点击链接可看动画演示

1 Two useful sorting abstrations

Less


private static boolean less(Comparable v, Comparable w)
{   return v.compareTo(w)< 0 ;}

Exchange

//exchange a[i] & a[j]
private static void exch(Comparable[] a,int i ,int j)
{
    Comparable swap = a[i];
    a[i] = a[j];
    a[j] = swap;
}

2.Selection Sort

select the min



1 rules of the game

  • Goal : Sort any type of data

sorting problem
612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第3张图片

real numbers

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第4张图片

String

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第5张图片

Callbacks

key point :passing function as arguments to other function
核心思想是将函数作为实参传递给其他函数
Interface-Java 使我们能够以类型安全的方式使用为任何类型的数据开发的排序算法
612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第6张图片

Roadmap | 技术路线图 - Callback

public inter face Comparable
{
    public int compareTo(Item that); // generics method
}

对象需要实现Compareble Interface()
这些数据类型具有重新实现compareTo()方法的实例方法
56f4240e221fb6c07d008741f0838bb3.png
排序实现里与数据类型无关
具体的比较由Comparable 接口处理

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第7张图片

Two useful sorting abstrations

Less


private static boolean less(Comparable v, Comparable w)
{   return v.compareTo(w)< 0 ;}

Exchange

private static void exch(Comparable[] a,int i ,int j)
{
    Comparable swap = a[i];
    a[i] = a[j];
    a[j] = swap;
}

2 Selection Sort | 选择排序

即使数据集已经部分有序,仍需重新遍历一遍
N^2

QuestionDemo-Selection Sort

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第8张图片

Inner Loop - Selection sort

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第9张图片

public class SelectionSort
{
    public static void sort(Comparable[] a)
    {
        int N = a.length;
        for (i = 0; i < N;i++)
        {
        int min = i;
        for(int j = i+1; j < N;j++)
            if(less(a[j], a[min]))
                min = j;
         exch(a, i, min);
        }
    }

    private static boolean less(Comparable v,Comparable w)
    {
        return v.compareTo(w) < 0;
    }

    private static void exch (Comparable[] a, int i, int j)
    {
        Comparable swap = a[i];
        a[i] = a[j];
        a[j] = swap;
    }

}

3 Insertion Sort | 插入排序

Move one position at one time
如果左边(比自己)更大,则继续向左互换

QuestionDemo-Insertion Sort

Step1

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第10张图片

Step2

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第11张图片

Inner Loop - Insertion sort

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第12张图片


import edu.princeton.cs.algs4.Insertion;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;


public class InsertionSort
{
    public static void sort(Comparable[] a)
    {
        int N = a.length;

        for (int i = 0; i < N; i++)
        {
            for(int j = i; j > 0; j--)
                if(less(a[j],a[j-1]))
                    exch(a,j,j-1);
                else break;
        }
    }

    private static boolean less(Comparable v,Comparable w)
    {
        return v.compareTo(w) < 0;
    }

    private static void exch (Comparable[] a, int i, int j)
    {
        Comparable swap = a[i];
        a[i] = a[j];
        a[j] = swap;
    }

}



public class SortDemo {
    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        Double[] a = new Double[N];
        for (int i = 0; i < N; i++) {
            a[i] = StdRandom.uniform();
        }
        Insertion.sort(a);
        for (int i = 0; i < N; i++) {
            StdOut.println(a[i]);
        }

    }
}

4 ShellSort | 希尔排序

Shell - the name of the creator 1959
Move more than one position at one time // compare to the Insertion Sort
一次移动多个位置
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

Photo:

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第13张图片

7,3,1 Sort

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第14张图片

  • Shellsort: which increment sequence to use?

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第15张图片

package edu.princeton.cs.algs4;


public class ShellSort{

    public static void sort(Comparable[] a){
        int n = a.length;
    //// x = 3x+1 increment sequence:  1, 4, 13, 40, 121, 364, 1093, ... 
        int h = 1;
        while (h < n/3) h = 3*h + 1;

        while (h >= 1) {
            //h-sort the array
            // Insertion sort
            for (int i = h; i < n;i++){
                for (j = i; j >= h && less(a[j],a[j-h]); j-= h){
                    exch(a, j, j-h);
                }
            }
            assert isHsorted(a, h); 
            h /=3;//move to next increment,eg. 13,4,1
        }
        assert isHsorted(a, h); 
    }

      /***************************************************************************
    *  Helper sorting functions.
    ***************************************************************************/
    
    // is v < w ?
    private static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }
        
    // exchange a[i] and a[j]
    private static void exch(Object[] a, int i, int j) {
        Object swap = a[i];
        a[i] = a[j];
        a[j] = swap;
    }


   /***************************************************************************
    *  Check if array is sorted - useful for debugging.
    ***************************************************************************/
    private static boolean isSorted(Comparable[] a) {
        for (int i = 1; i < a.length; i++)
            if (less(a[i], a[i-1])) return false;
        return true;
    }

    // is the array h-sorted?
    private static boolean isHsorted(Comparable[] a, int h) {
        for (int i = h; i < a.length; i++)
            if (less(a[i], a[i-h])) return false;
        return true;
    }

    // print array to standard output
    private static void show(Comparable[] a) {
        for (int i = 0; i < a.length; i++) {
            StdOut.println(a[i]);
        }
    }

    /**
     * Reads in a sequence of strings from standard input; Shellsorts them; 
     * and prints them to standard output in ascending order. 
     *
     * @param args the command-line arguments
     */
    public static void main(String[] args) {
        String[] a = StdIn.readAllStrings();
        ShellSort.sort(a);
        show(a);
    }


}

5 Shuffle - StdRandom.java

Knuth Shuffle
a uniformly random permutation of the input array in linear time.
洗牌

Goal
from

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第16张图片

to
612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第17张图片

Code

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第18张图片


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); //StdRandom.uniform 均匀分布  [0,i+1)
                                                        //r = between 0 and i
            exch(a,i,r);
        }
    }
    

}

6 Convex Hull

Graham's Scan
凸包
The convex hull of a set of N points is the smallest perimeter fence enclosing the points

Goal
612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第19张图片

counterclockwise:逆时针
clockwise:顺时针

mechanical algorithm

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第20张图片

Computer application
1.motion planning

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第21张图片

2.farthest pair

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第22张图片

Fact

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第23张图片

P.S. Polar angle

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第24张图片

Graham's Scan 葛立恒扫描

没错 ,就是提出葛立恒数的那位葛立恒
accroding the two facts

Demo

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第25张图片

challenge

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第26张图片

Implementing ccw(counterclockwise)

what is ccw

612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第27张图片

** math**

according to the Slope (斜率)
612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第28张图片

** implement**
612.1.004 ALGS4 | Elementary Sorts - 基础排序算法_第29张图片

你可能感兴趣的:(612.1.004 ALGS4 | Elementary Sorts - 基础排序算法)