归并排序,二分法搜索

Python数据结构与算法DAY7

归并排序

  1. 排序思路
    归并排序的思想就是先递归分解数组,再合并数组。将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。
  2. 归并排序的代码实现
def merge_sort(alist):
   if len(alist) <= 1:
       return alist
   # 二分分解
   num = len(alist)/2
   left = merge_sort(alist[:num])
   right = merge_sort(alist[num:])
   # 合并
   return merge(left,right)

def merge(left, right):
   '''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组'''
   #left与right的下标指针
   l, r = 0, 0
   result = []
   while l<len(left) and r<len(right):
       if left[l] < right[r]:
           result.append(left[l])
           l += 1
       else:
           result.append(right[r])
           r += 1
   result += left[l:]
   result += right[r:]
   return result

alist = [54,26,93,17,77,31,44,55,20]
sorted_alist = mergeSort(alist)
print(sorted_alist)
  1. 时间复杂度与稳定性
    【1】最优时间复杂度:O(nlogn)
    【2】最坏时间复杂度:O(nlogn)
    【3】稳定性:稳定
  2. 各排序算法性能比较
    在这里插入图片描述

二分法搜索

  1. 二分法查找的特点
    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
  2. 二分法查找的思路
    首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
  3. 二分法查找的代码实现
  • 递归实现
def binary_search(alist, item):
    if len(alist) == 0:
        return False
    else:
        midpoint = len(alist)//2
        if alist[midpoint]==item:
          return True
        else:
          if item<alist[midpoint]:
            return binary_search(alist[:midpoint],item)
          else:
            return binary_search(alist[midpoint+1:],item)

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))
  • 非递归实现
def binary_search(alist, item):
      first = 0
      last = len(alist)-1
      while first<=last:
          midpoint = (first + last)/2
          if alist[midpoint] == item:
              return True
          elif item < alist[midpoint]:
              last = midpoint-1
          else:
              first = midpoint+1
    return False
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))
  1. 二分法搜索的时间复杂度
    【1】最优时间复杂度:O(1)
    【2】最坏时间复杂度:O(logn)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值