# 2次元点群PointGroup pg
grahamScan(pg):
    Stack st
    leftmost ← pg.points の最も左下の点の番号
  orderedIndex ← pg.points をleftmost を基準に偏角でソートしたインデックスの列

    st.push(orderedIndex[0])
    st.push(orderedIndex[1])
    st.push(orderedIndex[2])

    for i ← 3 to pg.N-1:
        head = orderedIndex[i]
      
        while st.size() ≥ 2:
            top2 ← stの頂点の下の値
            top ← stの頂点の値
            if pg.points[top2] とpg.points[top]がなす直線に対して
               pg.points[head]が右側にある(時計回り):
                st.pop()
            else:
                break
        st.push(head)