基本排序算法【1】--冒泡、选择、插入排序

算法关键点:

  • 有序区
  • 无序区

1、冒泡排序 

        bubble sort 可以说是最简单的一种排序算法了,它的思想如下。对一个数组进行 n-1 轮迭代,每次比较相邻两个元素, 如果相邻的元素前者大于后者,就交换它们。因为直接在元素上操作而不是返回新的数组,所以是一个 inplace 的操作。 这里冒泡的意思其实就是每一轮冒泡一个最大的元素就会通过不断比较和交换相邻元素使它转移到最右边。

动图演示:

def bubble_sort(li):
    for i in range(len(li)-1):
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]

 冒泡排序-优化

       如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。

def bubble_sort(li):
    for i in range(len(li)-1):
        exchange = False
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        if not exchange:
            break
    return li

算法分析:

       时间复杂度:最佳情况:O(n);最坏情况:O(n^{2});平均时间复杂度:O(n^{2})

 

2 、选择排序

        选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 

def select_sort(li):
    for i in range(len(li) - 1):
        min_loc = i
        #注意这里有点要注意,列表的最后一个元素的索引是len(li)-1,可range函数是左闭右开的,故这里不需要做变动
        for j in range(i+1, len(li)):
            if li[j] < li[min_loc]:
            min_loc = j
        if min_loc != i:#这一句可有可无,写了只是有可能自己与自己相交换,故影响不大
            li[i], li[min_loc] = li[min_loc], li[i]

算法分析:

     时间复杂度:O(n2)

 

3 、插入排序

        插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

动图演示:

def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i - 1
        while j >= 0 and li[j]>tmp:
            li[j + 1] = li[j]
            j = j - 1
        li[j + 1] = tmp
    return li

算法分析:

    时间复杂度:O(n2)

    优化空间:应用二分查找来寻找插入点(并没有什么卵用)

参考资料:

https://www.cnblogs.com/onepixel/articles/7674659.html

猜你喜欢

转载自blog.csdn.net/qq_20412595/article/details/82527707
今日推荐