社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

GitHub星数13200!用Python实现所有排序算法的开源项目你见过么?

开源最前线 • 6 年前 • 636 次点击  

开源最前线(ID:OpenSourceTop) 猿妹整编

综合自:GitHub详情页


GitHub月度Trending榜单已经出炉,感兴趣的伙伴可点击查看上榜前十的开源项目:《9月份GitHub上最热门的开源项目》


本月榜单有一个项目成功吸引了我的注意,该项目用Python实现了所有的排序算法,包括插入排序、冒泡排序、快速排序、选择排序、归并排序等。



截至今日,该项目已经获得了 13200 个「star」以及 3758 个「fork」(GitHub项目地址:https://github.com/TheAlgorithms/Python


该创建者表示这些仅用于演示学习。由于性能的原因,Python标准库中有许多排序实现。



1、冒泡排序



冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它反复遍历要排序的列表,一次比较两个元素,如果它们的顺序错误则交换它们。重复遍历列表,直到不再需要交换,说明该列表排序完成。


性能分析

● 冒泡排序在最坏的情况下的比较次数是O(N^2) 

● 冒泡排序在最坏的情况下的比较次数是O(N)


代码实现


for i = 1:n,
    swapped = false
    for j = n:i+1,
        if a[j] 1],
            swap a[j,j-1]
            swapped = true
    → invariant: a[1..i] in final position
    break if not swapped
end



2、插入排序 



插入排序是一种简单的排序算法,可以一次构建一个项目的最终排序数组(或列表)。它在大型列表上的效率远低于更高级的算法,如快速排序,对堆排序或归并排序。


代码实现


for i = 2:n,
    for (k = i; k > 1 and a[k] 1]; k--)
        swap a[k,k-1]
    → invariant: a[1..i] is sorted
end



3、归并排序



归并排序(MERGE-SORT)是一种有效的、通用的,基于比较的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。由John von Neumann于1945年发明。


属性

● 最好时间复杂度O(nlogn)

● 最坏时间复杂度O(nlogn)

● 平均时间复杂度O(nlogn)


代码实现


# split in half
m = n / 2

# recursive sorts
sort a[1..m]
sort a[m+1..n]

# merge sorted sub-arrays using temp array
b = copy of a[1..m]
i = 1, j = m+1, k = 1
while i <= m and j <= n,
    a[k++] = (a[j]     → invariant: a[1..k] in  final position
while i <= m,
    a[k++] = b[i++]
    → invariant: a[1..k] in final position



归并排序在多种情况下都是首选的算法:当需要稳定性时,当排序链表时,当随机访问比顺序访问复杂得多时(例如,磁带上的外部排序)。



4、快速排序



快速排序(也被称为分区交换排序)是一种有效的排序算法,用作按顺序放置数组元素的系统方法。


代码实现


_# choose pivot_
swap a[1,rand(1,n)]

_# 2-way partition_
k = 1
for i = 2:n, if a[i] 1], swap a[++k,i]
swap a[1,k]
_→ invariant: a[1..k-1] 1..n]_

_# recursive sorts_
sort a[1..k-1]
sort a[k+1,n]



5、选择排序



选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 


代码实现


for i = 1:n,
    k = i
    for j = i+1:nif a[j]     → invariant: a[k] smallest of a[i..n]
    swap a[i,k]
    → invariant: a[1..i] in final position
end


选择排序的特性是最小化交换的数量。在交换项成本很高的应用程序中,选择排序可能是一种很好的选择算法。



6、希尔排序



希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因D.L.Shell于1959年提出而得名。


属性

● 最好时间复杂度O(nlog2 2n)

● 最坏时间复杂度O(n log n)

● 平均时间复杂度表现取决于差距序列


实现代码


h = 1
while h 3*h + 1
while h > 0,
    h = h / 3
    for k = 1:h, insertion sort a[k:h:n]
    → invariant: each h-sub-array is sorted
end




●编号416,输入编号直达本文

●输入m获取文章目录


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/9EYux7KfBo
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24917
 
636 次点击