摘要:
1. 使用 Python 实现初级排序算法:选择排序,插入排序,冒泡排序,希尔排序
2. 简单分析比较四种排序算法的性能
写在最前面
更多内容,请关注我的公众号: PythonAndMachineLearning
如需下载本文中的代码,关注公众号后,回复“初级排序” 即可获得下载链接~。
简介
关于排序的具体定义,这里就不多说了,写多了我都觉得是一些没有的废话。总之一句话,就是将给定的一组数据,按照从小到大或者从大到小的顺序进行排列。
这一组数据,一般情况下都是指数组,Python 中则指列表。需要注意的是,我们没有限定数组内部具体每个元素是什么类型。常见的也就是:整数,实数,字符串等等,当然我们也可以自己定义数据类型,自定义的数据类型需要满足一个条件,那就是元素之间可以比较大小。
我参考学习的主要是《算法》这本书,其中就提及我们使用的数据类型需要通过 Comparable 接口实现 less() 方法。没看懂这句话?并没有没什么影响。这句话的意思就是说,我们使用的数据类型必须能比较大小。感觉在 Java 中实现起来有点小麻烦,但是在 Python 中则相对比较简单,我们需要定义重载运算符 __lt__()
即可,关于这一点,后面会具体提及。
下面我们介绍三种排序算法:选择排序 、插入排序 和 冒泡排序,并做简单的分析。使用的数据为整数或者实数列表。
准备工作
在具体介绍之前,我们首先介绍几个简单的辅助函数:
exch() 函数
def exch(datalist, i, j):
'''
- 交换 datalist 中第 i 个数与第 j 个数的位置
'''
datalist[i], datalist[j] = datalist[j], datalist[i]
这里有一点需要注意,在 Python 中交换两个变量的值,并不需要中间再定义一个临时变量
isSorted() 函数
def isSorted(datalist):
'''
- 检测 datalist 中的元素是否有序
'''
for i in range(len(datalist)-1):
if datalist[i] > datalist[i+1]:
return False
这里需要注意的是 len() 函数的用法,如果 datalist 是一个列表,则不用操心。但是如果 datalist 是我们自定义的数据类型,就得注意在类中加入 __len__()
重载操作符。
选择排序
选择排序算法算是一种最简单的排序算法,其步骤如下:
- 找到数组中最小的那个元素
- 将这个最小的元素与第一个元素互换位置
- 在剩下的元素中找到一个最小的元素
- 将这个最小的元素与第二个元素互换位置
- 依次类推,直到最后
下面给出相应的 Python 代码:
# _*_ encoding:utf-8 _*_
'''
Created on 2017\11\29
@author: wangs0622
'''
import sort
# 上面给出的几个辅助函数都在 sort 这个文件中存放
def selectionSort(data):
for i in range(len(data)):
min_index = i
for j in range(i,len(data)):
if data[j] < data[min_index]: min_index = j
sort.exch(data, i, min_index)
if __name__ == '__main__':
data = [5,3,6,9,12,35,32,89,43,1,-2,-5,24,100,-34,23,43,23,89,11]
selectionSort(data)
print data
代码看上去很简单,并不复杂,主要是因为这个算法本身就比较简单。
选择排序算法简单分析
虽然这个算法看上去简洁明了,但是其计算时间比较长。假设给定的数组长度为 N