0
点赞
收藏
分享

微信扫一扫

【LeetCode】Python实现插入排序、选择排序、冒泡排序、归并排序、堆排序等

残北 2022-05-05 阅读 40

各种排序复杂度、稳定度对比:
在这里插入图片描述

class DiversitySort(object):
    # def __init__(self, arr):
    #     pass
    # self.arr = arr
    def generateRandomArr(self, maxLen, maxValue):
        """
        返回一个数组arr,arr长度[0,maxLen-1],arr中的每个值[0,maxValue-1]
        :return:
        """
        len = int(random.random() * maxLen)
        arr = [0] * len
        for i in range(len):
            arr[i] = int(random.random() * maxValue)
        return arr

    def heapify(self, arr, n, i):
        largest = i
        l = 2 * i + 1
        r = 2 * i + 2
        if l < n and arr[i] < arr[l]:
            largest = l

        if r < n and arr[largest] < arr[r]:
            largest = r

        if largest != i:
            arr[i], arr[largest] = arr[largest], arr[i]
            self.heapify(arr, n, largest)

    def heapSort(self, arr):
        """
        堆排序
        时间复杂度:
        空间复杂度:
        :param arr:
        :return:
        """
        n = len(arr)

        # Build a MaxHeap
        for i in range(n, -1, -1):
            self.heapify(arr, n, i)
        print(arr)
        # 一个个交换元素
        for i in range(n - 1, 0, -1):
            # Swap item
            arr[i], arr[0] = arr[0], arr[i]
            self.heapify(arr, i, 0)

    def selectSort(self, arr):
        """
        选择最小的 往前排
        :param arr:
        :return:
        """
        if not arr or len(arr) < 2:
            return arr

        for i in range(len(arr) - 1):
            minIndex = i
            for j in range(i, len(arr)):
                if arr[j] < arr[minIndex]:
                    minIndex = j

            arr[minIndex], arr[i] = arr[i], arr[minIndex]

        return arr

    def bubbleSort(self, arr):
        """
        两两比较,往后放
        :param arr:
        :return:
        """
        if not arr or len(arr) < 2:
            return arr
        for i in range(len(arr) - 1, -1, -1):
            for j in range(0, i):
                if arr[j] > arr[j + 1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr

    def insertSort(self, arr):
        """
        类似于玩扑克,抓到一张新牌,然后插入到序列中
        """
        if not arr or len(arr) < 2:
            return arr
        for i in range(1, len(arr)):
            newNumIndex = i
            while newNumIndex - 1 >= 0 and arr[newNumIndex - 1] > arr[newNumIndex]:
                arr[newNumIndex], arr[newNumIndex - 1] = arr[newNumIndex - 1], arr[newNumIndex]
                newNumIndex -= 1

        return arr

    def merge(self, arr, L, M, R):
            """
            对两个有序数组归并
            :param arr:
            :param L:
            :param M:
            :param R:
            :return:
            """
            # 辅助数组
            help = [None] * (R-L+1)
            i = 0
            # 左右两个数组的起始指针位置
            p1, p2 = L, M+1
            while p1 <= M and p2 <= R:
                if arr[p1] <= arr[p2]:
                    help[i] = arr[p1]
                    p1 += 1
                else:
                    help[i] = arr[p2]
                    p2 += 1
                i += 1

            # p2 越界了
            while p1 <= M:
                help[i] = arr[p1]
                i += 1
                p1 += 1

            # p1 越界了
            while p2 <= R:
                help[i] = arr[p2]
                i += 1
                p2 += 1

            # 将help数组拷贝回主数组中
            for i in range(len(help)):
                arr[L+i] = help[i]

    def mergeSort(self, arr):
        """
        归并排序,递归方法实现
        :param arr:
        :return:
        """

        def process(arr, L, R):
            if L == R:
                return
            mid = L + int((R - L) >> 1)
            process(arr, L, mid)
            process(arr, mid+1, R)
            self.merge(arr, L, mid, R)

        if not arr or len(arr) < 2:
            return

        process(arr, 0, len(arr) - 1)

    def mergeSort2(self, arr):
        """
        归并排序,非递归方法实现
        :param arr:
        :return:
        """
        if not arr or len(arr) < 2:
            return
        step = 1
        N = len(arr)
        while step < N:
            L = 0
            while L < N:
                # M = 0
                if N - L >= step:
                    M = L + step - 1
                else:
                    M = N - 1

                if M == N - 1:
                    break
                # R = 0
                if N - 1 - M >= step:
                    R = M + step
                else:
                    R = N - 1
                self.merge(arr, L, M, R)
                if R == N - 1:
                    break
                else:
                    L = R + 1

            if step > N/2:
                break

            step *= 2
举报

相关推荐

0 条评论