コード例 #1
0
ファイル: heap_sort.py プロジェクト: tyraeltong/py-algorithms
            end -= 1
            HeapSort._sift_down(data, 0, end)
        return data

    @staticmethod
    def _heapify(data, count):
        start = (count - 2) // 2
        while start >= 0:
            HeapSort._sift_down(data, start, count - 1)
            start -= 1

    @staticmethod
    def _sift_down(data, start, end):
        root = start
        while (root * 2 + 1) <= end:
            child = root * 2 + 1
            swap = root
            if data[swap] < data[child]:
                swap = child
            if (child + 1) <= end and data[swap] < data[child + 1]:
                swap = child + 1
            if swap != root:
                data[root], data[swap] = data[swap], data[root]
                root = swap
            else:
                return


if __name__ == '__main__':
    print_tests(HeapSort)
コード例 #2
0

class QuickSort:
    """
    Time complexity:
        - Worst case: O(nˆ2)
        - Best case: O(nlogn)
        - Average case: O(nlogn)
    Space complexity:
        - O(logn)
    """
    @staticmethod
    def sort(data):
        if data is None:
            raise TypeError("data should not be None.")

        if len(data) < 2:
            return data

        pivot_idx = random.randint(0, len(data) - 1)
        pivot = data[pivot_idx]
        smaller = [i for i in data[:pivot_idx] if i < pivot
                   ] + [i for i in data[pivot_idx + 1:] if i < pivot]
        greater = [i for i in data[:pivot_idx] if i >= pivot
                   ] + [i for i in data[pivot_idx + 1:] if i >= pivot]
        return QuickSort.sort(smaller) + [pivot] + QuickSort.sort(greater)


if __name__ == '__main__':
    print_tests(QuickSort)
コード例 #3
0
        MergeSort.sort(left)
        MergeSort.sort(right)

        i = j = k = 0

        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                data[k] = left[i]
                i += 1
            else:
                data[k] = right[j]
                j += 1
            k += 1

        while i < len(left):
            data[k] = left[i]
            i += 1
            k += 1

        while j < len(right):
            data[k] = right[j]
            j += 1
            k += 1

        return data


if __name__ == '__main__':
    print_tests(MergeSort)
コード例 #4
0
    def sort(data):
        if data is None:
            raise TypeError("data should not be None.")

        if len(data) < 2:
            return data

        for i in range(len(data) - 1):
            min_idx = SelectionSort._find_min_idx(data[i:])
            data[i], data[min_idx+i] = data[min_idx+i], data[i]
        return data

    @staticmethod
    def _find_min_idx(items):
        if len(items) < 1:
            return None

        min_item = items[0]
        min_idx = 0

        for idx in range(1, len(items)):
            if items[idx] < min_item:
                min_item = items[idx]
                min_idx = idx

        return min_idx


if __name__ == '__main__':
    print_tests(SelectionSort)
コード例 #5
0
    """
    @staticmethod
    def sort(data) -> list:
        if data is None:
            raise TypeError("data should not be None.")

        if len(data) < 2:
            return data

        # find out the max number in data
        max_num = max(data)
        min_num = min(data)
        aux = [0] * (max_num - min_num + 1)

        for i in range(len(data)):
            aux_idx = data[i] - min_num
            aux[aux_idx] += 1

        k = 0
        for j in range(len(aux)):
            if aux[j] > 0:
                for _ in range(aux[j]):
                    data[k] = j + min_num
                    k += 1

        return data


if __name__ == '__main__':
    print_tests(CountingSort)
コード例 #6
0
from sorting.utils import print_tests


class InsertionSort:
    """
    Time complexity:
        - Worst case: O(nˆ2)
        - Best case: O(n)
        - Average case: O(nˆ2)
    Space complexity:
        - O(1)
    """
    @staticmethod
    def sort(data):
        if data is None:
            raise TypeError("data should not be None.")

        if len(data) < 2:
            return data

        for i in range(1, len(data)):
            for j in range(i):
                if data[j] > data[i]:
                    data[j], data[i] = data[i], data[j]

        return data


if __name__ == '__main__':
    print_tests(InsertionSort)
コード例 #7
0
from sorting.utils import print_tests


class BubbleSort:
    """
    Time complexity:
        - worst case: O(nˆ2)
        - best case: O(n)
        - average case: O(nˆ2)
    Space complexity:
        - O(1)
    """
    @staticmethod
    def sort(data):
        if data is None:
            raise TypeError("data should not be None.")

        if len(data) < 2:
            return data

        for end in range(len(data) - 1, -1, -1):
            for i in range(end):
                if data[i] > data[i + 1]:
                    data[i + 1], data[i] = data[i], data[i + 1]

        return data


if __name__ == "__main__":
    print_tests(BubbleSort)