Python3 实现快速排序

快速排序是一种常用的排序算法,比选择排序快得多。例如,C语言标准库中的函数qsort 实现的就是快速排序。快速排序也使用了D&C。(分而治之)
(1) 找出简单的基线条件;
(2) 确定如何缩小问题的规模,使其符合基线条件。 D&C并非可用于解决问题的算法,而是一种解决问题的思路。我们再来看一个例子。 给定一个数字数组。

Python
# -*- coding: utf-8 -*- """ @author:songhao @file: c3.py @time: 2017/12/26 """ import random def quiksort(arr): """ 实现快速排序 :param arr: :return: """ if len(arr) < 2: return arr # 基线条件:为空或只包含一个元素的数组是“有序”的 else: pivot = arr[0] # 递归条件 less = [x for x in arr[1:] if x <= pivot] # 由所有小于基准值的元素组成的子数组 large = [z for z in arr[1:] if z > pivot] #由所有大于基准值的元素组成的子数组 print('less', arr, less) print('large', arr, large) print('分割线'.center(30, '#')) return quiksort(large) + [pivot] + quiksort(less) # 递归调用 if __name__ == '__main__': new = [random.choice(range(10)) for x in range(10)] print(new) # new = [1, 3, 5] print(quiksort(new))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -*- coding: utf-8 -*-
"""
@author:songhao
@file: c3.py
@time: 2017/12/26
"""
import random
 
 
def quiksort ( arr ) :
     """
    实现快速排序
    :param arr:
    :return:
    """
     if len ( arr ) < 2 :
         return arr # 基线条件:为空或只包含一个元素的数组是“有序”的
     else :
         pivot = arr [ 0 ] # 递归条件
         less = [ x for x in arr [ 1 : ] if x <= pivot ] # 由所有小于基准值的元素组成的子数组
 
         large = [ z for z in arr [ 1 : ] if z > pivot ] #由所有大于基准值的元素组成的子数组
 
         print ( 'less' , arr , less )
         print ( 'large' , arr , large )
         print ( '分割线' . center ( 30 , '#' ) )
         return quiksort ( large ) + [ pivot ] + quiksort ( less ) # 递归调用
 
 
if __name__ == '__main__' :
     new = [ random . choice ( range ( 10 ) ) for x in range ( 10 ) ]
     print ( new )
     # new = [1, 3, 5]
     print ( quiksort ( new ) )

返回结果是:

快速排序 速度很快

递归调用算法:

Python
""" # @Date: 2018-4-10 # @Project: 算法 # @Filename: quicksort.py # @Last modified by: songhao # @Copyright: 网址:www.168seo.cn 微信公众号:zeropython """ def quick_sort(alist, start, end): """快速排序 #在对快速排序优化的时候牢记一点:能够将列表均衡分开的标定点才是好的标定点。均匀分开意味着保持logn的复杂度。 #这里我并没有实现单路快排 快速排序是一种常用的排序算法,比选择排序快得多。例如,C语言标准库中的函数qsort 实现的就是快速排序。快速排序也使用了D&C。(分而治之) (1) 找出简单的基线条件; (2) 确定如何缩小问题的规模,使其符合基线条件。 D&C并非可用于解决问题的算法,而是一种解决问题的思路。我们再来看一个例子。 给定一个数字数组。 """ # 递归的退出条件 if start >= end: return # 设定起始元素为要寻找位置的基准元素 mid = alist[start] # low为序列左边的由左向右移动的游标 low = start # high为序列右边的由右向左移动的游标 high = end while low < high: # 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动 while low < high and alist[high] >= mid: high -= 1 # 将high指向的元素放到low的位置上 alist[low] = alist[high] # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动 while low < high and alist[low] < mid: low += 1 # 将low指向的元素放到high的位置上 alist[high] = alist[low] # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置 # 将基准元素放到该位置 alist[low] = mid # 对基准元素左边的子序列进行快速排序 quick_sort(alist, start, low-1) # 对基准元素右边的子序列进行快速排序 quick_sort(alist, low+1, end) if __name__ == '__main__': alist = [54,26,93,17,77,31,44,55,20] quick_sort(alist,0,len(alist)-1) print(alist) """ """ # @Date: 2018-4-10 # @Project: 算法 # @Filename: quicksort.py # @Last modified by: songhao # @Copyright: 网址:www.168seo.cn 微信公众号:zeropython """ def quicksort(data): left = 0 right = len(data) - 1 # if left > right: return quick_sort_x(data, left, right) def quick_sort_x(data, left, right): if left < right: mid = partition(data, left, right) quick_sort_x(data, left, mid - 1) quick_sort_x(data, mid + 1, right) def partition(data, left, right): tmp = data[left] while left < right: while left < right and data[right] >= tmp: right -= 1 data[left] = data[right] while left < right and data[left] <= tmp: left += 1 data[right] = data[left] data[left] = tmp return left """
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
# @Date:   2018-4-10
# @Project: 算法
# @Filename: quicksort.py
# @Last modified by:   songhao
# @Copyright: 网址:www.168seo.cn 微信公众号:zeropython
"""
 
def quick_sort ( alist , start , end ) :
     """快速排序
    #在对快速排序优化的时候牢记一点:能够将列表均衡分开的标定点才是好的标定点。均匀分开意味着保持logn的复杂度。
    #这里我并没有实现单路快排
    快速排序是一种常用的排序算法,比选择排序快得多。例如,C语言标准库中的函数qsort 实现的就是快速排序。快速排序也使用了D&C。(分而治之)
    (1) 找出简单的基线条件;
    (2) 确定如何缩小问题的规模,使其符合基线条件。
    D&C并非可用于解决问题的算法,而是一种解决问题的思路。我们再来看一个例子。 给定一个数字数组。
    """
 
     # 递归的退出条件
     if start >= end :
         return
 
     # 设定起始元素为要寻找位置的基准元素
     mid = alist [ start ]
 
     # low为序列左边的由左向右移动的游标
     low = start
 
     # high为序列右边的由右向左移动的游标
     high = end
 
     while low < high :
         # 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动
         while low < high and alist [ high ] >= mid :
             high -= 1
         # 将high指向的元素放到low的位置上
         alist [ low ] = alist [ high ]
 
         # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
         while low < high and alist [ low ] < mid :
             low += 1
         # 将low指向的元素放到high的位置上
         alist [ high ] = alist [ low ]
 
     # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
     # 将基准元素放到该位置
     alist [ low ] = mid
 
     # 对基准元素左边的子序列进行快速排序
     quick_sort ( alist , start , low - 1 )
 
     # 对基准元素右边的子序列进行快速排序
     quick_sort ( alist , low + 1 , end )
 
if __name__ == '__main__' :
     alist = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ]
     quick_sort ( alist , 0 , len ( alist ) - 1 )
     print ( alist )
 
 
 
"""
"""
# @Date:   2018-4-10
# @Project: 算法
# @Filename: quicksort.py
# @Last modified by:   songhao
# @Copyright: 网址:www.168seo.cn 微信公众号:zeropython
"""
 
def quicksort(data):
    left = 0
    right = len(data) - 1
    #
    if left > right:
        return
 
    quick_sort_x(data, left, right)
 
 
def quick_sort_x(data, left, right):
    if left < right:
        mid = partition(data, left, right)
        quick_sort_x(data, left, mid - 1)
        quick_sort_x(data, mid + 1, right)
 
def partition(data, left, right):
    tmp = data[left]
    while left < right:
        while left < right and data[right] >= tmp:
            right -= 1
        data[left] = data[right]
 
        while left < right and data[left] <= tmp:
            left += 1
        data[right] = data[left]
 
    data[left] = tmp
    return left
"""




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值