当前位置:首页 » 编程语言 » python实现排序算法

python实现排序算法

发布时间: 2024-09-10 12:08:19

① 面试必会八大排序算法python

一、插入排序

介绍

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。

算法适用于少量数据的排序,时间复杂度为O(n^2)。

插入排算法是稳定的排序方法。

步骤

①从第一个元素开始,该元素可以认为已经被排序

②取出下一个元素,在已经排序的元素序列中从后向前扫描

③如果该元素(已排序)大于新元素,将该元素移到下一位置

④重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

⑤将新元素插入到该位置中

⑥重复步骤2

排序演示

算法实现

二、冒泡排序

介绍

冒泡排序(Bubble Sort)是一种简单的排序算法,时间复杂度为O(n^2)。

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

原理

循环遍历列表,每次循环找出循环最大的元素排在后面;

需要使用嵌套循环实现:外层循环控制总循环次数,内层循环负责每轮的循环比较。

步骤

①比较相邻的元素。如果第一个比第二个大,就交换他们两个。

②对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

③针对所有的元素重复以上的步骤,除了最后一个。

④持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

算法实现:

三、快速排序

介绍

快速排序(Quicksort)是对冒泡排序的一种改进,借用了分治的思想,由C. A. R. Hoare在1962年提出。

基本思想

快速排序的基本思想是:挖坑填数 + 分治法。

首先选出一个轴值(pivot,也有叫基准的),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

实现步骤

①从数列中挑出一个元素,称为 “基准”(pivot);

②重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边);

③对所有两个小数列重复第二步,直至各区间只有一个数。

排序演示

算法实现

四、希尔排序

介绍

希尔排序(Shell Sort)是插入排序的一种,也是缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法,时间复杂度为:O(1.3n)。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

·插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率;

·但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位。

基本思想

①希尔排序是把记录按下标的一定量分组,对每组使用直接插入算法排序;

②随着增量逐渐减少,每组包1含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法被终止。

排序演示

算法实现

五、选择排序

介绍

选择排序(Selection sort)是一种简单直观的排序算法,时间复杂度为Ο(n2)。

基本思想

选择排序的基本思想:比较 + 交换。

第一趟,在待排序记录r1 ~ r[n]中选出最小的记录,将它与r1交换;

第二趟,在待排序记录r2 ~ r[n]中选出最小的记录,将它与r2交换;

以此类推,第 i 趟,在待排序记录ri ~ r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

排序演示

选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。

算法实现

六、堆排序

介绍

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。

利用数组的特点快速指定索引的元素。

基本思想

堆分为大根堆和小根堆,是完全二叉树。

大根堆的要求是每个节点的值不大于其父节点的值,即A[PARENT[i]] >=A[i]。

在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

排序演示

算法实现

七、归并排序

介绍

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

基本思想

归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

算法思想

自上而下递归法(假如序列共有n个元素)

① 将序列每相邻两个数字进行归并操作,形成 floor(n/2)个序列,排序后每个序列包含两个元素;

② 将上述序列再次归并,形成 floor(n/4)个序列,每个序列包含四个元素;

③ 重复步骤②,直到所有元素排序完毕。

自下而上迭代法

① 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

② 设定两个指针,最初位置分别为两个已经排序序列的起始位置;

③ 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

④ 重复步骤③直到某一指针达到序列尾;

⑤ 将另一序列剩下的所有元素直接复制到合并序列尾。

排序演示

算法实现

八、基数排序

介绍

基数排序(Radix Sort)属于“分配式排序”,又称为“桶子法”。

基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m) ,其中 r 为采取的基数,而m为堆数。

在某些时候,基数排序法的效率高于其他的稳定性排序法。

基本思想

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

基数排序按照优先从高位或低位来排序有两种实现方案:

MSD(Most significant digital) 从最左侧高位开始进行排序。先按k1排序分组, 同一组中记录, 关键码k1相等,再对各组按k2排序分成子组, 之后, 对后面的关键码继续这样的排序分组, 直到按最次位关键码kd对各子组排序后. 再将各组连接起来,便得到一个有序序列。MSD方式适用于位数多的序列。

LSD (Least significant digital)从最右侧低位开始进行排序。先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。LSD方式适用于位数少的序列。

排序效果

算法实现

九、总结

各种排序的稳定性、时间复杂度、空间复杂度的总结:

平方阶O(n²)排序:各类简单排序:直接插入、直接选择和冒泡排序;

从时间复杂度来说:

线性对数阶O(nlog₂n)排序:快速排序、堆排序和归并排序;

O(n1+§))排序,§是介于0和1之间的常数:希尔排序 ;

线性阶O(n)排序:基数排序,此外还有桶、箱排序。

② python常见的三种列表排序算法分别是什么

排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个关键字有序的序列。那么python列表排序算法有哪些?本文主要为大家讲述python中禅棚经常用的三种排序算法:冒泡排序、插入排序和选择排序。

1、冒泡排序

冒泡排序,Bubble

Sort,是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢浮到数列的顶端。

2、插入排序

插戚袭差入排序,Insertion

Sort,是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前的扫描过程中,需要把已排序元素逐步向后挪位,为最新元素提供插入空间。

3、选择高皮排序

选择排序,Selection

Sort,是一种简单直观的排序算法。它的工作原理如下:首先在未排序序列中找到最小、最大元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小、最大元素。放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

③ python将时间按多少先后排序正确的是

导读:很多朋友问到关于python将时间按多少先后排序正确的是的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

python中按文件时间顺序来排列一个文件夹下面的文件,如何实现?

建立一个字典,键是文件名,键值是时间属性,

然后用内置的sorted()函数,根据字典的值进行排序,返回一个有序的列表

假设字典名字叫folder,有序列表叫order

order=sorted(folder.items(),key=lambdae:e[1],reverse=False)

key=lambdae:e[1]表示按值进行排序,也就是你需要的按时间属性排序,e[0]则是按键名进行排序

reverse=False可以省略不写,默认是升序排列,reverse=True就是降序排列了

按时间先后顺序排列正确的是

下列中国古代朝代按时间先后排列正确的是,隋唐秦汉宋元明清

下列中国古代朝代顺序排列正确的一项是(B)

A.隋唐-秦汉-宋元-明清?B.秦汉-隋唐-宋元-明清?C.宋元-隋唐-秦汉-明清?D.明清-宋元-秦汉-隋唐

是指最新的时间排在最前,以此往下进行排序。与之相反的按时间升序排序。在实际应用中,各种评论一般默认排序是按时间降序排序。在实际很多应用中,经常需要进行排序,一般都是对象中的一个属性进行升序或降序,其中对时间进行排序是最常见一个属性。

排序的算法有很多,对空间的要求及其时间效率也不尽相同。下面列出了一些常见的排序算法。

相关介绍:

排序依据—按以下三个选项之一进行排序:数据源顺序—数据源对数据进行自然排序的顺序。通常,对于关系数据源,这往往是按字母顺序-更具体而言,是采用自然排序顺序,其与字母顺序相同,但多位数字会作为单个字符进行排序。

因此,例如,如果按字母顺序排序,"z11"先于"z2",因为"1"的计算结果小于"2",但是如果按自然顺序排序,"z2"先于"z11",因为"2"的计算结果小于"11"。

如果使用的是多维数据集,则该顺序是维度内成员的定义分层顺序。字母—字母表中的字母顺序。字段?—基于另一个字段的关联值对数据进行排序。例如,您可按多种产品的总销售额对这些产品进行排序。按时间降序排序是指最新的时间排在最前,以此往下进行排序。

用python编写程序。问题如下:有两列数据,一列是时间,形式为2011/5/3119:00,另一列是一个具体的数值

数据先导入,通常用csv。

然后是时间格式转换用time.strptime

转换完的时间可以直接取到hour,miniute,等属性,你直接按hour做当天平均值,再做月份的平均值。(其实可以一直计算,不用分开算)

最简单的办法是1个月的数据,全放在一起,按时间排序,然后按小时平均就可以了。

如果不想麻烦就这样

sum([vfort,vindataift.hour==2])/len([vfort,vindataift.hour==2])

这句话就是计算2点的数据平均值

怎样用python将文件里储存的时间按时间范围分类并且统计时间个数,然后存放在另一个文件里?

1,把时间的类型,最后变成timestamp类型,好操作

2,用pandas里面有.loc()这个函数可以判断范围,可以参考我的博客--判断时间是不是在一个区间范围内:

网页链接

python如何对日期进行从小到大排序

其实直接sorted排序就行.如果要严谨的花,改成用时间戳排序就是.

python几种经典排序方法的实现

classSortMethod:

'''

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。

插入算法把要排序的数组分成两部分:

第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置)

第二部分就只包含这一个元素(即待插入元素)。

在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

'''

definsert_sort(lists):

#插入排序

count=len(lists)

foriinrange(1,count):

key=lists[i]

j=i-1

whilej=0:

iflists[j]key:

lists[j+1]=lists[j]

lists[j]=key

j-=1

returnlists

'''

希尔排序(ShellSort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

'''

defshell_sort(lists):

#希尔排序

count=len(lists)

step=2

group=count/step

whilegroup0:

foriinrange(0,group):

j=i+group

whilejcount:

k=j-group

key=lists[j]

whilek=0:

iflists[k]key:

lists[k+group]=lists[k]

lists[k]=key

k-=group

j+=group

group/=step

returnlists

'''

冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

'''

defbubble_sort(lists):

#冒泡排序

count=len(lists)

foriinrange(0,count):

forjinrange(i+1,count):

iflists[i]lists[j]:

temp=lists[j]

lists[j]=lists[i]

lists[i]=temp

returnlists

'''

快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

'''

defquick_sort(lists,left,right):

#快速排序

ifleft=right:

returnlists

key=lists[left]

low=left

high=right

whileleftright:

whileleftrightandlists[right]=key:

right-=1

lists[left]=lists[right]

whileleftrightandlists[left]=key:

left+=1

lists[right]=lists[left]

lists[right]=key

quick_sort(lists,low,left-1)

quick_sort(lists,left+1,high)

returnlists

'''

直接选择排序

第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;

第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;

以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

'''

defselect_sort(lists):

#选择排序

count=len(lists)

foriinrange(0,count):

min=i

forjinrange(i+1,count):

iflists[min]lists[j]:

min=j

temp=lists[min]

lists[min]=lists[i]

lists[i]=temp

returnlists

'''

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。

可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]]=A[i]。

在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

'''

#调整堆

defadjust_heap(lists,i,size):

lchild=2*i+1

rchild=2*i+2

max=i

ifisize/2:

iflchildsizeandlists[lchild]lists[max]:

max=lchild

ifrchildsizeandlists[rchild]lists[max]:

max=rchild

ifmax!=i:

lists[max],lists[i]=lists[i],lists[max]

adjust_heap(lists,max,size)

#创建堆

defbuild_heap(lists,size):

foriinrange(0,(size/2))[::-1]:

adjust_heap(lists,i,size)

#堆排序

defheap_sort(lists):

size=len(lists)

build_heap(lists,size)

foriinrange(0,size)[::-1]:

lists[0],lists[i]=lists[i],lists[0]

adjust_heap(lists,0,i)

'''

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并过程为:

比较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]。

'''

defmerge(left,right):

i,j=0,0

result=[]

whileilen(left)andjlen(right):

ifleft[i]=right[j]:

result.append(left[i])

i+=1

else:

result.append(right[j])

j+=1

result+=left[i:]

result+=right[j:]

returnresult

defmerge_sort(lists):

#归并排序

iflen(lists)=1:

returnlists

num=len(lists)/2

left=merge_sort(lists[:num])

right=merge_sort(lists[num:])

returnmerge(left,right)

'''

基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,借以达到排序的作用,基数排序法是属于稳定性的排序。

其时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

'''

importmath

defradix_sort(lists,radix=10):

k=int(math.ceil(math.log(max(lists),radix)))

bucket=[[]foriinrange(radix)]

foriinrange(1,k+1):

forjinlists:

bucket[j/(radix**(i-1))%(radix**i)].append(j)

dellists[:]

forzinbucket:

lists+=z

delz[:]

returnlists

---------------------

作者:CRazyDOgen

来源:CSDN

原文:

版权声明:本文为博主原创文章,转载请附上博文链接!

结语:以上就是首席CTO笔记为大家整理的关于python将时间按多少先后排序正确的是的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

热点内容
oracle存储过程游标实例 发布:2024-11-25 05:40:32 浏览:803
xpsql2000 发布:2024-11-25 05:20:20 浏览:371
如何设置安卓上拉菜单 发布:2024-11-25 05:20:12 浏览:4
为什么安卓手机做不出透明相框 发布:2024-11-25 05:13:52 浏览:491
间接结算法 发布:2024-11-25 05:12:08 浏览:759
java咖啡机 发布:2024-11-25 05:12:05 浏览:489
小白主机怎么配置 发布:2024-11-25 05:10:33 浏览:144
automator脚本 发布:2024-11-25 04:41:18 浏览:310
敲背面截图怎么弄安卓 发布:2024-11-25 04:39:18 浏览:809
安卓机关机如何设置快捷方式 发布:2024-11-25 04:16:02 浏览:636