"""
快速排序的思想是基于分治法的思想:
在待排序的表L[1...n]中任意取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1...k-1] 和 L[k+1...n],
使得L[1...k-1]中所有元素小于pivot, L[k+1...n]中所有的元素大于或等于pivot,则pivot放在了其最终位置L[k]上,
这个过程称为一趟排序。
而后分别对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素都放在了最终位置上。
"""
def QuickSort(lists, low , high):
"""
主函数
:param lists: 传入一个列表
:param low: 列表的下表0
:param high: 列表的下表len(lists)-1
"""
if low < high:
pivotpos = Partition(lists, low, high)
QuickSort(lists, low, pivotpos-1)
QuickSort(lists, pivotpos+1, high)
def Partition(lists, low, high):
"""
把当前表中的第一个元素作为基准pivot对表进行划分,
则必须将表中比pivot大的元素像右移,比pivot小的元素像左移,使得经过一趟排序后,表中的元素被pivot一分为二。
:param lists:
:param low:
:param high:
:return:
"""
pivot = lists[low]
while low < high:
# 从后往前找 < pivot 值,与其交换
while low < high and lists[high] > pivot:
high = high - 1
else:
lists[low] = lists[high]
# 从前往后找 > pivot 值,与其交换
while low < high and lists[low] <= pivot:
low = low + 1
else:
lists[high] = lists[low]
lists[low] = pivot
return low
"""
快速排序的另一种实现方法:
"""
def quicksort(nums):
if len(nums) <= 1:
return nums
left = []
right = []
pivot = nums.pop()
for x in nums:
if x < pivot:
left.append(x)
else:
right.append(x)
return quicksort(left) + [pivot] + quicksort(right)
if __name__ == '__main__':
lists = [46, 79, 56, 38, 40, 84]
print(lists)
print(quicksort(lists))
Fighting-算法-快速排序
最新推荐文章于 2025-05-02 09:49:25 发布