python排序算法-(4)快速排序
快速排序是一种高效的排序算法,它的时间复杂度为 O(nlogn)。快速排序算法的基本思想是:通过一趟排序将待排序数组分成两部分,其中一部分中的所有元素都小于另一部分中的所有元素,然后再分别对两部分进行递归排序,最终即可完成整个数组的排序。
具体来说,快速排序算法的实现过程如下:
1. 首先,从数列中挑出一个元素作为基准元素(通常选取数列的最后一个元素或者随机一个元素作为基准元素);
2. 接着,把数列中所有小于基准元素的元素放在基准元素前面,把所有大于基准元素的元素放在基准元素后面(相等的元素可以放在任意一边)。这个过程称为分区操作(partition);
3. 对左右两个分区分别递归地进行快速排序。
4. 当分区只剩下一个或没有元素时,递归结束。
通过不断进行分区操作和递归调用,快速排序算法可以将未排序的数组或子数组进行排序。由于其时间复杂度优秀,在实际应用中得到广泛的使用。
import random
# 寻找分区位置的函数
def partition(array, low, high):
# 选择最右边的元素作为枢轴
pivot = array[high]
# 若要使用随机枢轴,请取消关注下面3行的注释:
######################################################################
# piv_index=random.randrange(low, high)
# pivot = array[piv_index]
# (array[high], array[piv_index]) = (array[piv_index], array[high])
######################################################################
# 指针 i
i = low - 1
# 遍历所有元素
# 将每个元素与枢轴比较
for j in range(low, high):
if array[j] <= pivot:
# 如果寻找到小于枢轴的元素,则将它与索引 i + 1 处的元素交换
i = i + 1
# 交换 i 和 j 处的元素
(array[i], array[j]) = (array[j], array[i])
# 将枢轴元素与指定索引 i + 1 处的元素交换
(array[i + 1], array[high]) = (array[high], array[i + 1])
# 返回枢轴元素的索引位置
return i + 1
# 快速排序函数
def quickSort(array, low, high):
if low < high:
# 调用 partition 函数获取枢轴元素的索引位置
pi = partition(array, low, high)
# 对枢轴元素左侧的子数组递归进行排序
quickSort(array, low, pi - 1)
# 对枢轴元素右侧的子数组递归进行排序
quickSort(array, pi + 1, high)
# 测试
array=random.sample(range(0, 100), 50)
print("原始数组为:")
print(array)
size = len(array)
quickSort(array, 0, size-1)
print('快速排序后的数组为:')
print(array)
运行环境:python3.8
原始数组为:
[81, 69, 61, 47, 42, 98, 14, 36, 18, 93, 55, 80, 22, 26, 11, 85, 9, 53, 43, 32, 90, 64, 51, 99, 33, 39, 45, 73, 63, 7, 48, 74, 60, 23, 2, 30, 20, 89, 54, 91, 96, 49, 44, 6, 65, 35, 19, 57, 79, 95]
快速排序后的数组为:
[2, 6, 7, 9, 11, 14, 18, 19, 20, 22, 23, 26, 30, 32, 33, 35, 36, 39, 42, 43, 44, 45, 47, 48, 49, 51, 53, 54, 55, 57, 60, 61, 63, 64, 65, 69, 73, 74, 79, 80, 81, 85, 89, 90, 91, 93, 95, 96, 98, 99]

