使用Python实现快速排序的函数
快速排序是一种常见的排序算法,它是基于分治法的思想来实现的。它的时间复杂度为 O(nlogn),它是一个非常高效的排序算法,因此很多编程语言都提供了内置函数来实现快速排序。在Python中,我们也可以使用内置函数来实现快速排序,也可以手动实现快排函数。
下面我们用Python来实现一个快速排序的函数。
1. 实现思路
快速排序的基本思路是以一个数(通常是数组的 个元素)为基准数(pivot),把数组中的元素按照比pivot小或等于pivot或大于pivot三类分为三个子序列。然后再对每个子序列递归地执行同样的操作,直到序列的长度为 1,排序结束。
实现快速排序的关键是实现划分函数。划分函数的作用是将数组分成两个部分,一部分是小于或等于基准数的元素,另一部分是大于基准数的元素。常用的划分算法是 Hoare 划分算法和 Lomuto 划分算法。
在这里,我们将使用 Lomuto 划分算法来实现快速排序。
2. Python 实现
接下来我们开始编写代码。我们假设 nums 是需要排序的数组,函数名为 quickSort。
- 首先,我们定义划分函数 partition。
- 在 partition 函数中,我们定义基准数 pivot,并从数组的第二个元素开始遍历,将数组的元素分为两个部分,一部分是小于或等于 pivot 的,另一部分是大于 pivot 的。
- 然后,我们将 pivot 与分区位置的最后一个元素交换,以确保分区后 pivot 的位置正确。这样,pivot 的左边都是小于它的元素,右边都是大于它的元素。
- 最后,我们返回分区位置。
- 接下来,我们使用递归调用将数组划分为子数组并分别对它们进行排序。
- 如果 left < right,我们对分区数组进行快速排序。
- 最后,我们在函数的末尾返回排序后的数组。
def partition(nums, left, right):
pivot = nums[left]
i = left + 1
j = right
while True:
while i <= j and nums[i] <= pivot:
i += 1
while i <= j and nums[j] >= pivot:
j -= 1
if i <= j:
nums[i], nums[j] = nums[j], nums[i]
else:
break
nums[left], nums[j] = nums[j], nums[left]
return j
def quickSort(nums, left=None, right=None):
if left is None:
left = 0
if right is None:
right = len(nums) - 1
if left < right:
pivot = partition(nums, left, right)
quickSort(nums, left, pivot - 1)
quickSort(nums, pivot + 1, right)
return nums
3. 测试
最后,我们编写测试用例对函数进行测试。我们将测试用例放在 if __name__ == "__main__" 的代码块中,以确保只有在本文件直接运行时才执行测试用例。
if __name__ == '__main__':
test_cases = [
([], []),
([1], [1]),
([2, 1], [1, 2]),
([3, 6, 9, 1, 8], [1, 3, 6, 8, 9]),
([0, 1, 0, 0, 0], [0, 0, 0, 0, 1]),
([-2, -3, 0, -1, -4], [-4, -3, -2, -1, 0]),
]
for nums, expected in test_cases:
result = quickSort(nums)
assert result == expected, f"Expected {expected}, but got {result}"
这段代码将使用六个测试用例来测试快速排序函数。如果测试通过,则在控制台中将没有任何输出。如果测试失败,则会显示 AssertionError 并输出具体错误信息。
4. 总结
快速排序是一个高效的排序算法,可以帮助我们在处理大量数据时大大提高效率。Python 内置的排序函数 sorted() 也是基于快速排序实现的。
了解快速排序的实现原理对于理解算法和编写更高效的代码都有很大帮助。在本文中,我们提供了使用 Python 实现快速排序的函数的详细说明。现在,你可以尝试使用这个函数对你的数据进行排序。
