コード例 #1
0
def selection_sort(lists):
    length = len(lists)

    for i in range(length):
        min_index = i
        for j in range(i + 1, length):
            if lists[min_index] > lists[j]:
                min_index = j
        swap(lists, min_index, i)
    return lists
コード例 #2
0
def bubble_sort(lists):
    length = len(lists)
    for i in range(length):
        for j in range(
                0,
                length - i - 1,
        ):
            if lists[j] > lists[j + 1]:
                swap(lists, j, j + 1)
    return lists
コード例 #3
0
    def sort(cls, lists, *args):
        if len(args):
            left = args[0]
            right = args[1]
            if left >= right:
                return

            swap(lists, left, int(random.random() * (right - left + 1)) + left)
            base = lists[left]
            """
            lists[left+1...lt] < v
            lists[gt...right] > v
            lists[lt+1...i) == v
            保证初始化的三个区间全部为空
            后续相应元素逐个添加进去
            """
            lt = left
            gt = right + 1
            i = left + 1
            while i < gt:
                if lists[i] < base:
                    swap(lists, lt + 1, i)
                    lt += 1
                    i += 1
                elif lists[i] > base:
                    swap(lists, gt - 1, i)
                    gt -= 1
                else:
                    i += 1
            swap(lists, left, lt)
            cls.sort(lists, left, lt - 1)
            cls.sort(lists, gt, right)
        else:
            cls.sort(lists, 0, len(lists) - 1)
コード例 #4
0
 def partition(lists, left, right):
     """
     选取第一个元素为标定点
     lists[left+1...k] < base; lists[k+1...right] > base
     :param lists:
     :param left:
     :param right:
     :return:
     """
     base = lists[left]
     k = left
     for i in range(left + 1, right + 1):
         if base > lists[i]:
             k += 1
             swap(lists, k, i)
     swap(lists, left, k)
     return k
コード例 #5
0
def insertion_sort(lists, *args):
    if len(args):
        for i in range(args[0] + 1, args[1] + 1):
            for j in range(i, 0, -1):
                if lists[j] < lists[j - 1]:
                    swap(lists, j, j - 1)
                else:
                    break
    else:
        length = len(lists)
        for i in range(1, length):
            for j in range(i, 0, -1):
                if lists[j] < lists[j - 1]:
                    swap(lists, j, j - 1)
                else:
                    break
    return lists
コード例 #6
0
    def partition(lists, left, right):
        # 随机标定点
        # lists[left...l] < base; lists[r...right] >= base
        swap(lists, left, int(random.random() * (right - left + 1)) + left)
        base = lists[left]

        l = left + 1
        r = right
        while True:
            while l <= right and lists[l] < base:
                l += 1
            while r >= left + 1 and lists[r] > base:
                r -= 1

            if l > r:
                break
            swap(lists, l, r)
            l += 1
            r -= 1
        """
        一次完整的遍历之后,l会停留在第一个大于base的位置,r会停留在第一个小于base的位置
        故将base的值与lists[r]进行交换,完成一次partition
        """
        swap(lists, left, r)
        return r
コード例 #7
0
    def partition(lists, left, right):
        """
        对于普通快排,若排序数组为近乎有序的
        每次选取第一个元素为标定点则会将算法时间复杂度往O(n*2)提高,接近于最坏的处理情况
        这种处理场景,随机快排能大幅度降低时间复杂度
        lists[left+1...k] < base; lists[k+1...right] > base

        """
        swap(lists, left, int(random.random() * (right - left + 1)) + left)
        base = lists[left]
        k = left
        for i in range(left + 1, right + 1):
            if base > lists[i]:
                k += 1
                swap(lists, k, i)
        swap(lists, left, k)
        return k