三个月算法进阶--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排序;选择排序:直接选择、堆排序;交换排序:冒泡排序、快速排序;归并排序;基数排序