python数据结构与算法(17)

归并排序
归并排序是采⽤分治法的⼀个⾮常典型的应⽤。归并排序的思想就是先递归 分解数组,再合并数组。
将数组分解最⼩之后,然后合并两个有序数组,基本思路是⽐较两个数组的 最前⾯的数,谁⼩就先取谁,取了后相应的指针就往后移⼀位。然后再⽐ 较,直⾄⼀个数组为空,最后把另⼀个数组的剩余部分复制过来即可。
归并排序的分析
6 5 3 1 8 7 2 4

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)

时间复杂度
最优时间复杂度:O(nlogn) 最坏时间复杂度:O(nlogn) 稳定性:稳定

常⻅排序算法效率⽐较
python数据结构与算法(17)
搜索
搜索是在⼀个项⽬集合中找到⼀个特定项⽬的算法过程。搜索通常的答案是 真的或假的,因为该项⽬是否存在。 搜索的⼏种常⻅⽅法:顺序查找、⼆分 法查找、⼆叉树查找、哈希查找
⼆分法查找
⼆分查找⼜称折半查找,优点是⽐较次数少,查找速度快,平均性能好;其 缺点是要求待查表为有序表,且插⼊删除困难。因此,折半查找⽅法适⽤于 不经常变动⽽查找频繁的有序列表。⾸先,假设表中元素是按升序排列,将 表中间位置记录的关键字与查找关键字⽐较,如果两者相等,则查找成功; 否则利⽤中间位置记录将表分成前、后两个⼦表,如果中间位置记录的关键 字⼤于查找关键字,则进⼀步查找前⼀⼦表,否则进⼀步查找后⼀⼦表。重 复以上过程,直到找到满⾜条件的记录,使查找成功,或直到⼦表不存在为 ⽌,此时查找不成功。
python数据结构与算法(17)
⼆分法查找实现

(⾮递归实现)

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))

(递归实现)

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))

时间复杂度
最优时间复杂度:O(1) 最坏时间复杂度:O(logn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值