如何用Python实现八大排序算法
这篇文章主要介绍了八大排序算法的Python实现,对八大排序算法进行详细描述和代码实现,感兴趣的小伙伴们可以参考一下
Python实现八大排序算法,具体内容如下
1、插入排序
描述
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
代码实现
def insert_sort(lists):
# 插入排序
count = len(lists)
for i in range(1, count):
key = lists[i]
j = i - 1
while j >= 0:
if lists[j] > key:
lists[j + 1] = lists[j]
lists[j] = key
j -= 1
return lists2、希尔排序
描述
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
代码实现
def shell_sort(lists):
# 希尔排序
count = len(lists)
step = 2
group = count / step
while group > 0:
for i in range(0, group):
j = i + group
while j < count:
k = j - group
key = lists[j]
while k >= 0:
if lists[k] > key:
lists[k + group] = lists[k]
lists[k] = key
k -= group
j += group
group /= step
return lists3、冒泡排序
描述
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
代码实现
def bubble_sort(lists):
# 冒泡排序
count = len(lists)
for i in range(0, count):
for j in range(i + 1, count):
if lists[i] > lists[j]:
lists[i], lists[j] = lists[j], lists[i]
return lists4、快速排序
描述
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
代码实现
def quick_sort(lists, left, right):
# 快速排序
if left >= right:
return lists
key = lists[left]
low = left
high = right
while left < right:
while left < right and lists[right] >= key:
right -= 1
lists[left] = lists[right]
while left < right and lists[left] <= key:
left += 1
lists[right] = lists[left]
lists[right] = key
quick_sort(lists, low, left - 1)
quick_sort(lists, left + 1, high)
return lists5、直接选择排序
描述
基本思想:第1趟,在待排序记录r1 ~ r[n]中选出最小的记录,将它与r1交换;第2趟,在待排序记录r2 ~ r[n]中选出最小的记录,将它与r2交换;以此类推,第i趟在待排序记录r[i] ~ r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
代码实现
def select_sort(lists):
# 选择排序
count = len(lists)
for i in range(0, count):
min = i
for j in range(i + 1, count):
if lists[min] > lists[j]:
min = j
lists[min], lists[i] = lists[i], lists[min]
return lists6、堆排序
描述
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
代码实现
# 调整堆
def adjust_heap(lists, i, size):
lchild = 2 * i + 1
rchild = 2 * i + 2
max = i
if i < size / 2:
if lchild < size and lists[lchild] > lists[max]:
max = lchild
if rchild < size and lists[rchild] > lists[max]:
max = rchild
if max != i:
lists[max], lists[i] = lists[i], lists[max]
adjust_heap(lists, max, size)
# 创建堆
def build_heap(lists, size):
for i in range(0, (size/2))[::-1]:
adjust_heap(lists, i, size)
# 堆排序
def heap_sort(lists):
size = len(lists)
build_heap(lists, size)
for i in range(0, size)[::-1]:
lists[0], lists[i] = lists[i], lists[0]
adjust_heap(lists, 0, i)7、归并排序
描述
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(pide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
代码实现
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def merge_sort(lists):
# 归并排序
if len(lists) <= 1:
return lists
num = len(lists) / 2
left = merge_sort(lists[:num])
right = merge_sort(lists[num:])
return merge(left, right)8、基数排序
描述
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
代码实现
import math
def radix_sort(lists, radix=10):
k = int(math.ceil(math.log(max(lists), radix)))
bucket = [[] for i in range(radix)]
for i in range(1, k+1):
for j in lists:
bucket[j/(radix**(i-1)) % (radix**i)].append(j)
del lists[:]
for z in bucket:
lists += z
del z[:]
return lists
Python一般可以用来干什么呢?
大多数科研机构都使用Python进行研究。卡内基梅隆大学和麻省理工学院的编程课程以Python讲授。许多开源科学计算软件包都提供Python调用接口,例如著名的计算机视觉库OpenCV,三维可视化库VTK和医学图像处理库ITK。还有更多专门用于Python的科学计算扩展库,例如NumPy,SciPy和matplotlib,它们分别提供矩阵计算,科学计算...
结合实际谈谈python在财务基础工作中的应用
3、此外,还可以使用Python的图表库(如Matplotlib、Seaborn等)对数据进行可视化展示,帮助财务人员更直观地了解财务状况。风险管理与预测:Python可以应用于财务风险管理和预测模型的构建。Python的相关知识如下:1、Python支持多种编程范式,包括面向对象的、命令式、函数式和过程式编程。它有一个巨大而广泛的...
如何利用 Python 实现 SVM 模型
我先直观地阐述我对SVM的理解,这其中不会涉及数学公式,然后给出Python代码。SVM是一种二分类模型,处理的数据可以分为三类:线性可分,通过硬间隔最大化,学习线性分类器 近似线性可分,通过软间隔最大化,学习线性分类器 线性不可分,通过核函数以及软间隔最大化,学习非线性分类器 线性分类器,在...
如何用python实现巴斯卡三角形算法
1、何为帕斯卡三角形(巴斯卡三角形)其实,帕斯卡三角形就是杨辉三角形,是二项式系数的一种写法,从第0层开始,依次类推,如图所示:比如第2层中的1 2 1 对应的是幂指数为2的二项式运算(a+b)^2=a^2+2ab+b^2的系数 2、如何用python实现该算法 在碰到难的题目,一时不知道如何下手解决的时候...
如何用python进行数据分析
利用python进行数据分析 链接: https:\/\/pan.baidu.com\/s\/15VdW4dcuPuIUEPrY3RehtQ ?pwd=3nfn 提取码: 3nfn 本书也可以作为利用Python实现数据密集型应用的科学计算实践指南。本书适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。
用Python如何实现啊,还需要画流程图,在线求解
简单 百度不能输空格,我用>>>代表缩进。导入模块,如出现 ModuleNotFoundError: No module named 错误,在cmd中输入 “pip install 错误的模块”import random import easygui def a():>>>nums = random.randint(0, 20) # 生成数字 >>>for i in ['1', '1', '1', '1', '1']: ...
你都用Python 来做什么?
你都用 Python 来做什么?那Python 作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python 的应用领域有哪些呢?Python 的应用领域非常广泛,几乎所有大中型互联网企业都在使用 Python 完成各种各样的任务,例如国外的 Google、Youtube、Dropbox,国内的百度、新浪、搜狐、腾讯、...
如何利用python实现类似c语言的共同体?
import ctypes #你可以看看ctypes,它可以支持union,下面是一个例子 from ctypes import ( Union, Array,c_uint8, c_uint32,cdll, CDLL )class uint8_array(Array):_type_ = c_uint8 _length_ = 4 class u_type(Union):_fields_ = ("data", c_uint32), ("chunk", uint8_array...
如何用python实现对数据库的整理
连接的关键是安装MySQLdb模块要下载与Python相对应的版本:下载好后安装,它会自动检测到计算机Python的安装路径,并自动填写模块解压路径(我的是:D:\\ProgramFiles\\ActivePython 2.6.6.17\\Lib\\site-packages\\)。但解压完成后并不能使用,还要修改MySQLdb模块下的一些文件:①.在MySQLdb目录下(我的是:D:\\ProgramFiles\\...
Python使用函数实现乘法表,任意输入一个正整数,生成乘法表默认值是九九...
要使用Python函数实现乘法表,可以定义一个函数,接受一个正整数参数n,然后用两层for循环打印出nn的乘法表。如果没有传入参数,就默认打印99的乘法表。例如:定义一个函数,打印乘法表 def print_table(n=9):用两层for循环遍历行和列 for i in range(1,n+1):for j in range(1,i+1):打印...
须翰迪尔: 序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说说八大排序就是内部排序
彬县15677791080: 怎样用python将数组里的数从高到低排序 - ?
须翰迪尔: 1、首先我们定义一个列表输入一串大小不一的数字. 2、可以用sort()方法对定义的列表排序,注意,sort只是对列表排序,它没有返回一个值. 3、输入print列表名即可得到排序后的列表数据. 4、倒序可以用这个reverse方法,把元素位置倒转过来.5、然后再次print列表名,这样就会得到倒转顺序之后的列表数据.5、如图两相对比即实现了从高到低和从低到高排序.
彬县15677791080: 求一个简单的Python给数字排序代码 - ?
须翰迪尔: 简单排序的话,直接使用 list.sort() 就可以了,直接在原列表上进行排序. 非要写成函数的形式的话,代码如下1 2 3 4 5 6 7 8 9defABC(nums_l):nums_l.sort()returnnums_l l =[1,2,5,3,4] # 其实,使用 l.sort() 之后,就对l进行了排序,然...
彬县15677791080: python排序! - ?
须翰迪尔: 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Python实例:>>> list = [2,5,8,9,3] >>> list [2,5,8,9,3] >>> list.sort() >>> list [2, 3, 5, 8, 9] 方法2.用序列类型函数sorted(list)进行排序(从2.4开始) Python实例:>...
彬县15677791080: Python中,如何给列表排序? - ?
须翰迪尔: Python中给列表排序的方式有很多,可以自己实现知,也可以用Python提供的方法 使用Python提供的方法:列表.sort() 列表.sort(reverse=True) 自己实现:num_list = [64, 34, 25, 12, 22, 11, 90] print(num_list) n = len(num_list)# 遍历所有数组元...
彬县15677791080: python怎么使用sort - ?
须翰迪尔: 一、基本形式 sorted(iterable[, cmp[, key[, reverse]]])iterable.sort(cmp[, key[, reverse]])参数解释: (1)iterable指定要排序的list或者iterable,不用多说; (2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如...
彬县15677791080: 如何用python写一个给三个数排序的程序 - ?
须翰迪尔: 用python写一个给三个数排序的程序,使用5行代码如下: #-*-coding:utf-8; a=[2,1,3]; print("排序前",a); a.sort() print("排序后",a);
彬县15677791080: 如何使用python来对二维数组进行复合排序 - ?
须翰迪尔: 直接用numpy的lexsort就可以import numpy as np data = np.array([[1,2,3,4,5], [1,2,3,6,7], [2,3,4,5,7], [3,4,5,6,7], [4,5,6,7,8]]) idex=np.lexsort([-1*data[:,2], data[:,1], data[:,0]]) #先按第一列升序,再按第二列升序,再按第三列降序 #注意先按后边的关键词排序 sorted_data = data[idex, :]
彬县15677791080: 请教如何用python按字母顺序排序英文名字但是不可以用sort函数 - ?
须翰迪尔: 代码如下: list = ['banana', 'apple', 'orange', 'blueberry', 'watermelon', 'strawberry', 'mango'] print(list) list.sort() #根据字母顺序排序 print(list) #['apple', 'banana', 'blueberry', 'mango', 'orange', 'strawberry', 'watermelon'] list.sort(reverse = True) #根据...
彬县15677791080: Python选择排序算法 如何做!急求!! - ?
须翰迪尔: #coding: utf-8 #!/usr/bin/python import random#随机生成0~100之间的数值def get_andomNumber(num):lists=[]i=0while i<num:lists.append(random.randint(0,100))i+=1 return lists# 选择排序def select_sort(lists): count = len(lists) for i in range(...