用 Python 学习算法:初级排序算法

本文介绍了使用Python实现的选择排序、插入排序和冒泡排序算法,详细分析了每种排序算法的步骤和性能,包括算法的时间复杂度。并提供了自定义数据类型排序的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:
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__() 重载操作符。

选择排序

选择排序算法算是一种最简单的排序算法,其步骤如下:

  1. 找到数组中最小的那个元素
  2. 将这个最小的元素与第一个元素互换位置
  3. 在剩下的元素中找到一个最小的元素
  4. 将这个最小的元素与第二个元素互换位置
  5. 依次类推,直到最后

下面给出相应的 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值