题目

实现一个快速排序

思路

待排序的数列中,我们首先要找一个数字作为基准数(pivot,直译是中心枢纽, 这只是个专用名词)。为了方便,我们一般选择第 1 个数字作为基准数(其实选择第几个并没有关系)。接下来我们需要把这个待排序的数列中小于基准数的元素移动到待排序的数列的左边,把大于基准数的元素移动到待排序的数列的右边。这时,左右两个分区的元素就相对有序了;接着把两个分区的元素分别按照上面两种方法继续对每个分区(partition)找出基准数,然后移动,直到各个分区只有一个数时为止。

第一个数一般选择中位数,涉及到中位数算法,较复杂。
三点中值算法:选择第0个、中间的、最后的,在3个数中选择中间数

代码

  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)
  1. def _quick_sorted(nums:list) -> list:
  2. pivot = nums[0]
  3. left_nums = _quick_sorted([num for num in nums[1:] if num < pivot])
  4. right_nums = _quick_sorted([num for num in nums[::-1] if num >= pivot])
  5. return left_nums+ [pivot] + right_nums
  1. def quick_sort(array, l, r):
  2. if l < r:
  3. q = partition(array, l, r)
  4. quick_sort(array, l, q)
  5. quick_sort(array, q + 1, r)
  6. def partition(array, l, r):
  7. pivot = array[l]
  8. i = l + 1
  9. for j in range(l+1, r):
  10. if array[j] < pivot:
  11. array[i], array[j] = array[j], array[i]
  12. i += 1
  13. array[i - 1], array[l] = array[l], array[i - 1]
  14. return i - 1
  15. if __name__ == "__main__":
  16. array = [3, 5, 7, 1, 10]
  17. quick_sort(array, 0, len(array))
  18. print(array)