目录

三个月算法进阶--day69

超过一半的数

对拼消耗,不内战,缩小规模后的众数

python的堆是小根堆

取相反数

TOP K

快排(只看一边,找到k位置,不用全排好)与堆(小顶堆)

class Solution:
    def partition(self, nums, l, r):
        pivot = nums[r]
        i = l - 1
        for j in range(l, r):
            if nums[j] <= pivot:
                i += 1
                nums[i], nums[j] = nums[j], nums[i]
        nums[i + 1], nums[r] = nums[r], nums[i + 1]
        return i + 1

    def randomized_partition(self, nums, l, r):
        i = random.randint(l, r)
        nums[r], nums[i] = nums[i], nums[r]
        return self.partition(nums, l, r)

    def randomized_selected(self, arr, l, r, k):
        pos = self.randomized_partition(arr, l, r)
        num = pos - l + 1
        if k < num:
            self.randomized_selected(arr, l, pos - 1, k)
        elif k > num:
            self.randomized_selected(arr, pos + 1, r, k - num)

    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        if k == 0:
            return list()
        self.randomized_selected(arr, 0, len(arr) - 1, k)
        return arr[:k]

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        if k == 0:
            return list()

        hp = [-x for x in arr[:k]]
        heapq.heapify(hp)  # 列表原地转换为堆
        for i in range(k, len(arr)):
            if -hp[0] > arr[i]:
                heapq.heappop(hp)
                heapq.heappush(hp, -arr[i])
        ans = [-x for x in hp]
        return ans

随机化快排

lo/hi

heapq.nsmallest(n, iterable)/heapq.nlargelest(n, iterable)

heapify(x), heappush(heap, item), heappop(heap), heappushpop(heap, item), heapreplace(heap. item)

heapsort的简单实现

def heapsort(iterable):
    h = []
    for value in iterable:
        heappush(h, value)
    return [heappop(h) for i in range(len(h))]

堆是完全二叉树,堆的子树也是堆

排序算法的稳定性

排序前相等的数的前后位置和排序后顺序相同

排序算法的分类

插入排序:直接插入、Shell排序;选择排序:直接选择、堆排序;交换排序:冒泡排序、快速排序;归并排序;基数排序