禅道 排序算法

版权声明: https://blog.csdn.net/u011286584/article/details/82665799

禅道 排序算法

这里用 Python 总结常用的几种排序算法

定期整理点滴,完善自己,今后给洋哥挣钱,陪伴着让我的小宝贝发自内心爱上笑,加油吧

这里写图片描述

插入排序

直译写法

def insert_sort(list):
    n = len(list)
    for i in range(1, n):
        for j in range(i, 0, -1):
            if list[j] < list[j - 1]:
                list[j], list[j - 1] = list[j - 1], list[j]
            else:
                break

算法分析
上面的代码中,list[j], list[j - 1] = list[j - 1], list[j]·这一步很费操作步骤,相当于执行三次复制,而且大小判断,需要每个循环遍历一遍,如果用赋值语句操作,采用附加条件,可以对算法进行优化

优化后写法

def insert_sort(list):
    n = len(list)
    for i in range(1, n):
        key = list[i]
        j = i - 1
        while j >= 0 and list[j] > key:
            list[j + 1] = list[j]
            j -= 1
        list[j + 1] = key

代码解析
在这个算法里,我们使用 key 来存储外循环中第一个元素的值,创建 j 变量代表当前元素的前一个元素的下标,我们使用 while 循环,并用 and 添加循环条件 list[j] > key ,来判断当前元素是否比外循环中的当前元素 key 大,这样能提前结束循环,不需要每个遍历一遍,保证算法效率,如果满足上面的条件,对当前元素进行赋值,较大元素保存在里面,接着让 j - 1 后继续循环,当循环结束后,把 key 存储到合适的位置,即 list[j = 1] 此处。

选择排序

def select_sort(list):
    n = len(list)
    for i in range(n - 1):
        min_index = i
        for j in range(i + 1, n):
            if list[min_index] > list[j]:
                min_index = j

        if i != min_index:
            list[min_index], list[i] = list[i], list[min_index]

代码解析
我们用 for 循环数据直至最后一个元素,在外循环中,首先假设第一个元素是当前数据的最小元素,用 min_index 记录其下标,内循环开始遍历数据,从第 i + 1 个元素开始,验证当前最小下标所代表的元素是否是所有数据中的最小元素,如果不是则进行交换,把实际最小元素的下标赋值给 min_index ,最后的 if 语句是为了容错处理,因为一开始假设把最小值下标赋给了 min_index ,替换原来的值,直至外循环遍历结束。

冒泡排序

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

        if count == 0:
            break

代码解析
冒泡排序是在两个元素间操作,外循环只有 n - 1 次,定义 count 变量来记录交换次数,内循环中为了不遍历先前已经排好的元素,range 的参数设置为 n - i - 1 ,再判断两个相邻元素的大小,如果当前元素大于下一个元素,则交换两个元素的值,接着继续记录 count ,若 count == 0 ,序列已经有序

扫描二维码关注公众号,回复: 3405724 查看本文章

希尔排序

def shell_sort(list):
    n = len(list)
    gap = n // 2
    while gap >= 1:
        for i in range(gap, n):
            j = i
            while (i - gap) >= 0:
                if list[i] < list[i - gap]:
                    list[i], list[i - gap] = list[i -gap], list[i]
                    j -= gap
                else
                    break
        gap //= 2

代码解析
可以将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了,我们选择增量 gap = len // 2 ,增量影响算法的性能

本篇尚未完
2018年9月12日18时于广州逸夫科学馆

猜你喜欢

转载自blog.csdn.net/u011286584/article/details/82665799
今日推荐