一、 主旨
1. 需求描述
排序。
2. 运行结果
二、 代码分析
1. 思路分析
- 我们对数组进行二分,分别排序左边和右边。
- 两边尾巴分别是两边最大的数,更大的那个一定是整个数组最大的那个数,我们把它放到最右边。
- 那么右边的部分就是有序的,我们只需要处理左边没排序的部分就可以了,问题规模缩小啦!
- 我们写的就是个排序方法,因此可以递归地进行这个过程。
- 递归退出条件很明显:当数组长度为1时,它本身是有序的。
2. 复杂度分析
不会算。
3. 代码实现
排序
。
if __name__ == '__main__':
def nb_sort(a, l, r):
"""
对a数组的区间[l,r]非降序排序
:param a:
:param l:
:param r:
:return:
"""
if l == r:
return
m = l + (r - l) // 2
nb_sort(a, l, m) # 排左边
nb_sort(a, m + 1, r) # 排右边
if a[m] > a[r]: # m是左边最大的,r是右边最大的,把大的放到r,那么r一定是整个数组最大的
a[m], a[r] = a[r], a[m]
nb_sort(a, l, r - 1) # 好了,只需要排剩下[l, r-1]了~
a = [6, 9, 7, 3, 4, 5, 1, 2, 8, 0]
print(a)
nb_sort(a, 0, len(a) - 1)
print(a)
三、 本题小结
- 时间复杂度怎么算呢?
- 没有十年脑血栓写不出这么牛的排序。