https://leetcode-cn.com/problems/smallest-k-lcci/

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

思路

考察快速排序的思想

  1. class Solution:
  2. def smallestK(self, arr: List[int], k: int) -> List[int]:
  3. # 快速排序思想
  4. if len(arr) == 0: return []
  5. idx = self.partition(arr, 0, len(arr) - 1)
  6. if idx == k:
  7. return arr[:idx]
  8. elif idx < k:
  9. return arr[:idx] + self.smallestK(arr[idx:], k - idx)
  10. else:
  11. # idx > k
  12. return self.smallestK(arr[:idx], k)
  13. def partition(self, array, l, r):
  14. pivot = array[r]
  15. i = l - 1
  16. for j in range(l, r):
  17. if array[j] <= pivot:
  18. i += 1
  19. array[i], array[j] = array[j], array[i]
  20. array[i+1], array[r] = array[r], array[i+1]
  21. return i+1

快速排序

  1. def quick_sort(array, l, r):
  2. if l < r:
  3. q = partition(array, l, r)
  4. quick_sort(array, l, q - 1)
  5. quick_sort(array, q + 1, r)
  6. def partition(array, l, r):
  7. x = array[r]
  8. i = l - 1
  9. for j in range(l, r):
  10. if array[j] <= x:
  11. # 控制升序还是降序
  12. i += 1
  13. array[i], array[j] = array[j], array[i]
  14. array[i + 1], array[r] = array[r], array[i+1]
  15. # print(array)
  16. return i + 1
  17. if __name__ == "__main__":
  18. array = [10, 5, 3, 1, 7]
  19. quick_sort(array, 0, len(array)-1)
  20. print(array)