图解算法

1. 数据查找之二分法

  • 对象:数组
  • 使用前提:已排序数组
  • 时间复杂度:O(longn)

如下图我们需要在已排序数组中寻找数字21,我们针对已经排过序的数组可以使用二分法来查找。

大体思路为:

找出现在数组顺序为中间位置(序号6)的值(56),用寻找到的数字和数组中间位置值去比较(图中数组中间的值为56,我们要寻找的是21,21<56),那我们寻找的值就在56左边部分的数组中,我们将这部分数组拿出来作为一个新的数组,继续新数组中间位置的值和需要寻找值的大小比较,通过这种比较,我们每次查找都可以将查找的范围缩小1/2,这种方法也就是常说的二分法,接下来我们用代码来实现;


image
def dichomoty(array, find_num):
    min_index = 0
    max_index = len(array) - 1
    while min_index <= max_index:
        mid = int((min_index + max_index) / 2)
        mid_num = array[mid]
        if mid_num == find_num:
            return mid
        if mid_num > find_num:
            max_index = mid - 1
        else:
            min_index = mid + 1
    return None

array_test = [3,15,19,21,37,56,64,75,80,88,92]
print(dichomoty(array_test, 21))

输出结果为

3
[Finished in 0.8s]

2. 选择排序

将数组元素按照从小到大的顺序排序,每次从数组中取出最小值,新增到另一个数组。

def find_small_num(arr):
    small_num = arr[0]
    small_index = 0
    for i in range(len(arr)):
        if small_num > arr[i]:
            small_num = arr[i]
            small_index = i
    return small_index


def select_sort(arr):
    new_arr = []
    for _ in range(len(arr)):
        small_index = find_small_num(arr)
        new_arr.append(arr.pop(small_index))
    return new_arr


array_test = [3,21,15,92,1,45,33,75,99,88,37]
select_sort(array_test)

输出结果为

[1, 3, 15, 21, 33, 37, 45, 75, 88, 92, 99]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章是《图解算法》一书的摘抄总结。原书标题是《Grokking Algorithms》,grok是中文“意会”...
    SeanCheney阅读 3,137评论 0 14
  • 读书笔记:图解算法 算法简介 二分查找 O(log n) 大O表示法 大O表示法 让你能够比较操作数,它指出了算法...
    石头的书桌阅读 360评论 0 0
  • 1. 二分查找 2. 选择排序 3. 快速排序 4. fibonacci 5. 广度优先算法 查找最短路径, 无向...
    manbug阅读 493评论 0 0
  • 进入图解算法四,看完这一章对一些概念性的东西有了一些理解,在这里记录下。 分而治之----一种著名的递归式问题解决...
    lskylines阅读 208评论 0 1
  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 9,241评论 0 10