Exemple #1
0
    def sort(a, lo=None, hi=None):
        if lo is None:
            lo = 0
        if hi is None:
            hi = len(a) - 1

        if lo >= hi:
            return

        if hi - lo + 1 < ThreeWayQuickSort.CUTOFF:
            InsertionSort.sort(a, lo, hi)
            return

        i = lo
        lt = lo
        gt = hi

        while i <= gt:
            if util.less(a[i], a[lo]):
                util.exchange(a, i, lt)
                i += 1
                lt += 1
            elif util.less(a[lo], a[i]):
                util.exchange(a, i, gt)
                gt -= 1
            else:
                i += 1

        ThreeWayQuickSort.sort(a, lo, lt - 1)
        ThreeWayQuickSort.sort(a, gt + 1, hi)
Exemple #2
0
    def sink(tmp, k, n):

        while k * 2 <= n:
            child = k * 2
            if child < n and less(tmp[child + 1], tmp[child]):
                child = child + 1
            if less(tmp[child], tmp[k]):
                exchange(tmp, child, k)
                k = child
            else:
                break
Exemple #3
0
 def sink(self, k):
     while 2 * k <= self.N:
         child = 2 * k
         if child < self.N and less(self.keys[self.pq[child]], self.keys[self.pq[child+1]]):
             child = child+1
         if less(self.keys[self.pq[child]], self.keys[self.pq[k]]):
             exchange(self.pq, k, child)
             self.qp[self.pq[k]] = k
             self.qp[self.pq[child]] = child
             k = child
         else:
             break
Exemple #4
0
 def sort(a):
     N = len(a)
     for i in range(N):
         k = i
         for j in range(i + 1, N):
             if util.less(a[j], a[k]):
                 k = j
         util.exchange(a, i, k)
Exemple #5
0
 def swim(self, k):
     while k > 1:
         parent = k // 2
         if less(self.pq[k], self.pq[parent]):
             exchange(self.pq, k, parent)
             k = parent
         else:
             break
Exemple #6
0
    def index_of(a, x, lo=None, hi=None):
        if not is_sorted(a):
            raise ValueError('array must be sorted before running selection')

        if lo is None:
            lo = 0
        if hi is None:
            hi = len(a) - 1

        while lo <= hi:
            mid = lo + (hi - lo) // 2
            if less(x, a[mid]):
                hi = mid - 1
            elif less(a[mid], x):
                lo = mid + 1
            else:
                return mid

        return -1
Exemple #7
0
 def swim(self, k):
     while k > 1:
         parent = k // 2
         if less(self.keys[self.pq[k]], self.keys[self.pq[parent]]):
             exchange(self.pq, k, parent)
             self.qp[self.pq[k]] = k
             self.qp[self.pq[parent]] = parent
             k = parent
         else:
             break
 def visit(self, G, v):
     self.marked[v] = True
     for e in G.adj(v):
         w = e.other(v)
         if not self.marked[w]:
             if self.pq.contains_index(w):
                 old_e = self.pq.get(w)
                 if less(e, old_e):
                     self.pq.decrease_key(w, e)
             else:
                 self.pq.insert(w, e)
Exemple #9
0
    def sort(a, lo=None, hi=None):
        if lo is None:
            lo = 0
        if hi is None:
            hi = len(a) - 1

        for i in range(lo, hi + 1):
            for j in reversed(range(1, i + 1)):
                if util.less(a[j], a[j - 1]):
                    util.exchange(a, j, j - 1)
                else:
                    break
Exemple #10
0
    def sort(a):
        N = len(a)
        H = 0
        while H < N // 3:
            H = 3 * H + 1

        for h in reversed(range(1, H)):
            for i in range(h, N):
                for j in range(i, h - 1, -h):
                    if util.less(a[j], a[j - h]):
                        util.exchange(a, j, j - h)
                    else:
                        break
Exemple #11
0
    def partition(a, lo, hi):
        i = lo
        j = hi

        while True:
            while not util.less(a[lo], a[i]):
                i += 1
                if i >= hi:
                    break

            while util.less(a[lo], a[j]):
                j -= 1
                if j <= lo:
                    break

            if i >= j:
                break

            util.exchange(a, i, j)

        util.exchange(a, lo, j)
        return j
Exemple #12
0
    def _merge(a, aux, lo, mid, hi):
        i = lo
        j = mid + 1

        for k in range(lo, hi + 1):
            aux[k] = a[k]

        for k in range(lo, hi + 1):
            if i > mid:
                a[k] = aux[j]
                j += 1
            elif j > hi:
                a[k] = aux[i]
                i += 1
            elif util.less(aux[i], aux[j]):
                a[k] = aux[i]
                i += 1
            else:
                a[k] = aux[j]
                j += 1
Exemple #13
0
 def __lt__(self, other):
     return util.less(self.weight, other.weight)
 def test_less(self):
     self.assertTrue(less(4, 5))
     self.assertFalse(less(4, 4))