《算法图解》第四章 快速排序
作者:互联网
1、分而治之(divide and conquer,D&C)
(1)步骤:①找到简单的基线条件(可能是空数组货只包含一个元素的数组);②不断分解问题/缩小规模,直至符合基线条件。
(2)不是用于解决问题的算法,而是一种解决问题的思路。
(3)原理:将问题逐步分解。
2、欧几里得算法:gcd(a,b)=gcd(b,a mod b)
def gcd(a,b): while a!=0: #a=b%a;b=a a,b=b%a,a return b
3、 快速排序
(1)基准值(pivot)、分区(partitioning)
(2)code medo
def quicksort(array): if len(array)<2: # 基线条件:为空货只包含一个元素的数组是有序的 return array else: # 递归条件 pivot=array[0] print(array[1:]) # 由所有小于基准值的元素组成的子数组 less=[i for i in array[1:] if i<=pivot] # 由所有大于基准值的元素组成的子数组 greater=[i for i in array[1:] if i>pivot] return quicksort(less)+[pivot]+quicksort(greater) print(quicksort([10,5,2,3,4]))
(3)实现快速排序的时候,请随机地选择基准值的元素。
4、收纳证明步骤:基线条件和归纳条件
5、大O表示法
(1)O(n log n):快速排序在平均情况下运行时间 / 合并排序,快速查找的常量要比合并查找小。
(2)c*n:c为算法所需要的的固定时间量,成为常量。
(3)平均情况(最佳情况):每层时间*层数即调用栈的高度=O(n)*O(log n)=O(n log n)
最糟糕情况:每层时间*层数即调用栈的高度=O(n)*O(n)=O(n^2)
(4)比较简单查找和二分查找时,常量几乎无关紧要,由于列表很长是,O(log n)的速度比O(n)快得多。但是在比较快速排序于合并排序的时候又是事关紧要的。
答案:
4.1 CODE
# 例子1
arr=[2,4,6]
def sum1(arr):
total=0
for i in range(0,len(arr)):
total+=arr[i]
return total
print(sum1(arr))
# 例子2
def sum2(arr):
total=0
for x in arr:
total+=x
return total
print(sum2([2,4,6]))
4.2 CODE
arr=[1,2,3,4,5,6]
print(len(arr))
def count(arr):
if len()
4.3 CODE
def maxArr(arr):
max=arr[0]
for i in range(len(arr)):
if arr[i]>max:
max=arr[i]
return max
arr=[-10,-1,-5,-2,-8,-3]
print(maxArr(arr))
4.4 CODE
def binary_search(list,item): low=0 high=len(list)-1 # 基线条件 while low<=high: mid=(low+high)//2 guess=list[mid] # 递归条件 if guess==item: return mid elif guess>item: high=mid-1 else: low=mid+1 return None list=[1,2,3,1,5,6] print(binary_search(list,4))
4.5 O(c*n)
4.6 O(c*n)
4.7 O(1)
4.8 O(c*n^2)
标签:total,arr,排序,return,len,第四章,print,图解,def 来源: https://www.cnblogs.com/annuush/p/15353859.html