《算法》-排序[初级排序算法]

《算法》系列,是面向《算法》第四版这本书进行学习,会去除繁琐的文字叙述,会从以下两个方面去理解一个算法:

1、这个算法是什么?

2、这个算法怎么用?

    整个系列会使用python作为编程语言,避免看着文本抄袭的麻烦。一些关于《算法》这本书的学习方法可以参考:算法学习之路

 

选择排序

属于不稳定排序

 

步骤:

1、找到数组中最小的元素

2、将它和第一个元素交换位置

3、再从剩下的元素中找到最小的元素,将它和第二个元素进行交换,如此往复

def select(lists):
    count = len(lists)
    for i in range(count):
        min = i
        for j in range(i+1,count):
            if lists[j] < lists[min]:
                min = j
        lists[min], lists[i] = lists[i], lists[min]
    return lists
​
if __name__ == "__main__":
    print (select([1,3,3,2,8,3,4,5,6]))

插入排序

属于稳定排序

相当于抓牌,将每一张牌放到相应位置

 

步骤:

选一个key,对比前面的数字,进行交换

def insert_sort(arr):
    for i in range(1,len(arr)):
        key = arr[i]
        left = i
        for j in reversed(range(left)):
            if arr[j] > key:
                arr[j+1] = arr[j]
                arr[j] = key
    return arr
​
if __name__ == "__main__":
    print (insert_sort([1,4,23,5,3,4,5,9,32,2]))

希尔排序

不稳定排序,平均nlog(n)

希尔排序(Shell’s Sort)是插入排序的一种,相对于插入排序只能相邻之间交换,希尔排序可以在子序列中进行交换。

希尔排序对于中等大小的数组的运行时间是可以接受的,出来对于很大的N,其他算法可能比希尔排序快两倍,而且更复杂。

 

步骤:

1、把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序

2、随着步长逐渐减小,所分成的组包含的记录越来越多

3、当步长值减小到1时,整个数据合成一组,构成一组有序记录,完成排序

def shell_sort(alist):
    n = len(alist)
    gap = n // 2
    while gap >= 1:
        for j in range(gap, n):
            i = j
            while (i - gap) >= 0:
                if alist[i] < alist[i - gap]:
                    # 交换
                    alist[i], alist[i - gap] = alist[i - gap], alist[i]
                    # 修改i
                    i = i - gap
                else:
                    break
        gap //= 2
​
​
if __name__ == '__main__':
    print(shell_sort([6, 7, 5, 3, 4, 1, 8]))

 

公众号:算法手记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值