快速排序算法

算法思想

可参考:快速排序
快速排序也是用的分治递归的思想,但是相比归并不需要额外的空间复杂度,空间复杂度为O(1)
首先选取一个基准值,然后比较数组剩余元素与基准值的大小,比基准值小的放在基准值的左边,比基准值大的放在基准值的右边。
依次类推,递归进行每次划分后的数组。

  1. 选择索引first处的值为基准值
  2. 通过从左到右扫描与从右到左扫描,left是左扫描位置,right是右扫描位置,找到左边第一个大于基准值的位置与右边第一个小于基准值的位置
  3. 然后将这两个值交换,并将left向右移动,right向左移动,继续重复进行
  4. 直到left>right,也就是全部扫描一遍后,将基准值s[b]与最后的left位置交换,这样就完成了分割
  5. 然后再进行递归调用两个序列

算法实现

'''
    快速排序
    '''
	# 使用三个数组分别保存比基准值小的,与基准值相等的,比基准值大的三种类型的数
    def quickSort1(array):
        n = len(array)
        if n <= 1:
            return array
        mid = []
        low = []
        high = []
        base = array[0]

        for i in range(n):
            if array[i] <  base:
                low.append(array[i])
            elif array[i] == base:
                mid.append(array[i])
            else:
                high.append(array[i])
        lowArr = quickSort1(low)
        highArr = quickSort1(high)

        res = lowArr + mid + highArr
        return res
 def quickSort(array, first, last):
        if first >= last:
            return array
        # 基准值,用于将数组划分为两部分,比基准值大的右侧,和比基准值小的左侧
        base = array[first]
        # 定义两个指针分别指向数组的最左第一个和最右第一个
        left = first
        right = last
        # 两个指针不相等时,执行循环体内过程
        while left < right:
            # 从右往左,放比基准最大的数,如果满足,只需将指针向前移动
            while left < right and base <= array[right]:
                right -= 1
            # 遇到比基准值小的,将右指针所指的数放在左指针所指的位置
            array[left] = array[right]
            # 从左往右,放比基准值小的数,如果满足,只需将指针向后移动
            while left < right and array[left] <= base:
                left += 1
            # 遇到比基准值大的,将左指针所指的数放在右指针所指的位置
            array[right] = array[left]
        # 最后将基准值添加到一趟划分好的两数组的中间,此时,左右两个指针相等,所以基准值放在哪个指针下都可以
        array[right] = base

        # 递归对左右两个数组进行快排,这时前一趟循环的基准值将不算入其中
        self.quickSort(array, first, left-1)
        self.quickSort(array, left+1, last)
        return array
        
if __name__ == '__main__':
    array = [14, 33, 6, 27, 10, 35, 19, 42, 44]
    array_quick = s.quickSort(array, 0, len(array)-1)
    print('快速排序:', array_quick)      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值