基本排序算法04----快速排序(quick sort)

快速排序:

在快速排序中,我们用到了‘分而治之’的思想。也就是说,每一个算法都找到了一种方法,将列表分解为更小的子列表。随后,这些字列表再递归地排列。


快速排列的过程如下:

1.从列表的中点位置选取一项(我们把这一项称之为基准点pivot)

2.将列表中的项进行分区,以便小于基准点的所有项都移动到基准点的左边,而剩下的移动到右边

3.对于在基准点分割形成的子列表,递归重复上述过程

4.每次遇到少于两项的一个子列表,就结束该过程


对于分割操作的详解:

1.将基准点与子列表的最后一项交换位置

2.在列表第一项的左边建立一个边界

3.从列表第一项开始,扫描整个子列表,每次遇到小于基准点的项,就将其与边界后的第一项交换位置,并且边界向后移动一位

4.将基准点与边界后的第一项交换位置


具体快速排序的实现 代码如下:

#定义一个用于交换位置的函数
def swap(lyst, i, j):
    temp = lyst[i]
    lyst[i] = lyst[j]
    lyst[j] = temp


#定义分割函数
def partition(lyst, left, right):
    # 找到基准点(定义为pivot)并且把该项与最后一项交换位置
    middle = (left + right) // 2
    pivot = lyst[middle]
    lyst[middle] = lyst[right]
    lyst[right] = pivot
    # 在起始项的左边设置边界线
    boundary = left
    # 将小于基准点的项移到左边
    for index in range(left, right):
        if lyst[index] < pivot:
            swap(lyst, index, boundary)
            boundary += 1
    # 将基准点与最后一项调换位置
    swap (lyst, right, boundary)
    return boundary


#定义递归函数,重复操作
def quicksortHelper(lyst, left, right):
    if left < right:
        pivotLocation = partition(lyst, left, right)
        #将分割后的子列表(左)重复分割操作
        quicksortHelper(lyst, left, pivotLocation - 1)
        #将分割后的子列表(右)重复分割操作
        quicksortHelper(lyst, pivotLocation + 1, right)


#定义运行函数
def quicksort(lyst):
    quicksortHelper(lyst, 0, len(lyst) - 1)
接下来进行测试
#以下为运行测试内容

#生成一个由随机数列表
import random
lyst = []
for count in range(10):
    lyst.append(random.randint(0,11))
print(lyst)

#调用快速排序函数
quicksort(lyst)
print(lyst)

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值