您的位置:首页 > 其它

折半查找、快速排序

2017-12-03 16:13 155 查看

折半查找

循环实现

'''
折半查找
循环实现
'''

def binarySearch(list, key):
low = 0
high = len(list) - 1
while (low <= high):  # 循环法的判断条件,就是递归法的基线条件
mid = (low + high) // 2
gess = list[mid]
if gess > key:
high = mid - 1
if gess < key:
low = mid + 1
if gess == key:
return mid
return -1

print(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 6))


递归实现

# 递归实现折半查找
def binarySearch2(list, low, high, key):
if (low > high):  # 递归的基线条件
return -1
else:
mid = (low + high) // 2
if (list[mid] == key):
return mid
if (key > list[mid]):
return binarySearch2(list, mid + 1, high, key)  # 在序列的后半部分查找
else:
return binarySearch2(list, low, mid - 1, key)  # 在序列的前半部分查找

print(binarySearch2([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 0, 10, 6))


快速排序

开辟新空间存储中间结果

'''
快速排序
递归实现,分而治之
实现1, 开辟新空间存储中间结果
实现2, 不开辟多余空间来存储中间结果
'''

# 合并数组
# print([1, 2, 3, 4] + [5, 6, 7, 8])

# 递归法快速排序实现1
def qSort(list):
if len(list) < 2:  # 基线条件,数组只有一个元素或者没有元素是,不需要排序,直接返回
return list
else:  # 需要排序的数组
pivot = list[0]
less = [i for i in list[1:] if i < pivot]
greater = [i for i in list[1:] if i > pivot]
return qSort(less) + [pivot] + qSort(greater)

listA = [40, 30, 20, 25, 60, 10]
print(qSort(listA))


快速排序

分而治之的典型算法,在递归过程中要明确基线条件和递归条件

# 递归法快速排序实现2
def qSort2(list, left, right):
if left >= right:
return None
else:
bound = getBound(list, left, right)

qSort2(list, left, bound - 1)  # 对基准值左侧进行排序
qSort2(list, bound + 1, right)  # 对基准值右侧进行排序

def getBound(list, left, right):  # 使用双指针,参考基准值从两头开始挑拣元素
povit = list[left]
while (left < right):
while (left < right and list[right] >= povit):
right -= 1

list[left] = list[right]
while (left < right and list[left] <= povit):
left += 1

list[right] = list[left]

list[left] = povit
return left

print(listA)
qSort2(listA, 0, len(listA) - 1)
print(listA)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息