三种排序算法详解:插入、冒泡、快速排序

好几年前就接触了排序算法,那时候写都是直接用的brute force方法。那时候心没有静下来好好去想,而且只得其形,未得其意,难以理解不同排序算法间的精髓所在。近期在看《图解算法》这本书,借助一幅幅图的表达和演化,恍然顿悟,这算法原来并没有想象中的那么难!


插入排序

排序算法的起名,都是和其特性有关,这也是我近来才体会到的,如插入排序(Insert Sort)。从名字上看,和选择有关,但具体又是如何选的呢,接下来来看看。

假设有这么个待排序的数组[4,3,1,5,2],使用选择排序的话,我们要怎么做呢?

以下是算法的步骤:

  1. 建立一个空数组1、一个待排序数组2
  2. 每次从待排序数组中找出最大的一个,插入到数组1中
  3. 去除待排序数组中当前最大的数
  4. 重复步骤2,3直到待排序数组为空

以下是选择排序的一个样例:

def find_maxvalue(arr):
    find_max = arr[0]
    for index in xrange(len(arr)):
        if arr[index] > find_max:
            find_max = arr[index]
    return find_max

def insert_sort(arr):
    result = []
    while len(arr) > 0:
        max_value = find_maxvalue(arr)
        result.append(max_value)
        arr.remove(max_value)
    return result

 


冒泡排序

生活中,泡泡从水里冒出来是什么样子的呢?是不是越接近水面,泡泡就越大?此排序算法也因此得名,名称:Bubble Sort。

算法步骤如下:

  1. 以数组的第一项为开头
  2. 每次比较相邻两个元素,并把大的放到后面
  3. 直到比较至末尾的最后一个元素
  4. 此时完成一轮比较
  5. 针对所有的元素重复以上的步骤,除了最后一个(上一轮得到的,以此类推)。

 

def bubbleSort(arr):
    for index in xrange(len(arr)-1):
        for j in xrange(index, len(arr)-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

快速排序

这是一种典型的分而治之的算法,通过不断的将问题分解为子问题,对要解决的问题进行简化。记得初中时候就有遇见过这类型的题目(有N个球和一个天平,有一个球比较重,用最少的次数找出来),只不过那时候比较笨,没有搞清楚到时候为什么那么比较最省力。 

算法步骤:

  1. 选一个key
  2. 按照这个key值,把比它大的放右边,比它小的放左边
  3. 重复步骤1、2,直到最后分出来的数组只有一个
  4. 合并结果

def quick_sort(arr):
    if len(arr) < 2:
        return arr
    key = arr[0]
    left_side = [i for i in arr[1:] if i < key]
    right_side = [i for i in arr[1:] if i >= key]
    # print(left_side, right_side)
    left_side = quick_sort(left_side)
    right_side = quick_sort(right_side)

    return left_side + [key] + right_side

总结时刻:

不同的算法,对不同问题的处理情况下有着不同的时间或空间复杂度。因此,选择时需要结合实际问题,做出适当的调整,这样可以达到事半功倍的效果。

 最佳情况平均情况最坏情况
插入排序O(n)O(n^2)O(n^2)
冒泡排序O(n^2)O(n^2)O(n^2)
快速排序O(nlogn)O(nlogn)O(n^2)

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值