折半查找、快速排序
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)